Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбор варианта для ХП.. / 6 сообщений из 6, страница 1 из 1
21.08.2004, 23:52:20
    #32660192
Matt Juntunen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
Здравствуйте!
Подскажите, какой вариант правильнее с точки зрения "процедурописания" для FB 1.0?
(Процедура выводит список товаров + кол-во из журнала операции с товарами. Пример упрощен.)
Так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Create PROCEDURE TEST 
RETURNS (
    ID INTEGER,
    NAME VARCHAR( 45 ) CHARACTER SET WIN1251,
    KOLVO INTEGER)
AS
begin
For Select Tov_ID, Tov_Name,(Select SUM(OT_KOLVO) From OPER_Tov Where TOV_NO = Tovar.Tov_ID)
 From Tovar
 Into :ID, :Name, :Kolvo
Do
 begin
  If (Kolvo Is Null) Then Kolvo =  0 ;
  Suspend;
 end /*Do*/ 
end

или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Create PROCEDURE TEST 
RETURNS (
    ID INTEGER,
    NAME VARCHAR( 45 ) CHARACTER SET WIN1251,
    KOLVO INTEGER)
AS
begin
For Select Tov_ID, Tov_Name
 From Tovar
 Into :ID, :Name
Do
 begin
  Select SUM(OT_Kolvo)
   From OPER_TOV
   Where Tov_No = :ID
   Into :Kolvo;
  If (Kolvo Is Null) Then Kolvo =  0 ;
  Suspend;
 end /*Do*/ 
end

P.S. Как в IBExpert получить пла выполнения ХП?
...
Рейтинг: 0 / 0
23.08.2004, 06:28:05
    #32660476
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
Правильность я бы рассматривал с точки зрения времени выполнения запроса. На мой взгляд запросы выполняться будут одинаковое время, но первый запрос более структурированее что ли... Лучше Вам ответят более опытные форумцы ;)

авторP.S. Как в IBExpert получить пла выполнения ХП?
На вкладке для ХП "Анализ плана", а после выполнения "Анализ производительности"
...
Рейтинг: 0 / 0
23.08.2004, 10:00:26
    #32660675
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
Не помню точно, но каэется Case появилась в 1.5
В этом упрошенном варианте, вообще можно обойтись без ХП - одним селектом.

Код: plaintext
1.
Select Tov_ID, Tov_Name,(Select SUM(case (when OT_KOLVO IS NULL THEN  0  ELSE OT_KOLVO END)) From OPER_Tov Where TOV_NO = Tovar.Tov_ID)
From Tovar

Ну а про процедуру - надо смотреть планы. Скорость выполнения почти будет одинакова. Но меня могут поправить !

Best regards,
Dnico
.
...
Рейтинг: 0 / 0
23.08.2004, 20:08:20
    #32662012
Matt Juntunen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
Спасибо всем. Первый вариант оказался лучше тем, что всегда возвращает Null при отсутствии агрегат. функции в подзапросе. А ХП у меня потому, что эта конструкция - часть большой ХП, возвращающей приложению разные выборки (связанные с товаром) в зависимсти от значения доп. параметра.
...
Рейтинг: 0 / 0
23.08.2004, 20:34:21
    #32662027
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
DnicoНе помню точно, но каэется Case появилась в 1.5
В этом упрошенном варианте, вообще можно обойтись без ХП - одним селектом.
Код: plaintext
1.
2.
3.
4.
Select Tov_ID, 
Tov_Name,
(Select SUM(case (when OT_KOLVO IS NULL THEN  0  ELSE OT_KOLVO END)) 
    From OPER_Tov Where TOV_NO = Tovar.Tov_ID)
From Tovar
Ну а про процедуру - надо смотреть планы. Скорость выполнения почти будет одинакова. Но меня могут поправить !Могут и обложить...
Запрос абсолютно бестолковый.
При выполнении агрегатной функции SUM() , записи содержащие NULL игнорируются.
Посему, CASE внутри SUM тут нафиК не нужен.
Ибо только тормозов добавляет, ничего полезного не делая.
SUM() вернёт NULL только в том случае, если все записи подпадающие
под условие выборки содержат этот самый NULL , либо, если результат выборки пустой.
А чтоб конвертировать NULL в 0 (или любое иное значение) есть COALESCE() .
"Накладывать" его нужно "сверху" на SUM() .
...
Рейтинг: 0 / 0
24.08.2004, 09:52:29
    #32662331
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор варианта для ХП..
Ну вот ... как я и думал ...
Мимопроходящий

Best regards,
Dnico
.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выбор варианта для ХП.. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]