powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапрос в параметре процедуры
57 сообщений из 57, показаны все 3 страниц
Подзапрос в параметре процедуры
    #39553027
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер))

есть процедура SP1, которая, получая на вход ID некой таблицы TABLE1, возвращает строго 1 запись, поля A, B, C, D.
в процедуре SP2 необходимо выполнить усреднение рассчитанных параметров A, B, C, D за определенный период записей из TABLE1.
Иными словами необходимо выполнить что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
for 
  SELECT :ID FROM TABLE1
  WHERE ...
  INTO :ID 
do
...
select avg(A), avg(B), avg(C), avg(D) from SP1 (:ID) into...


где :ID это массив записей, который вернул внешний SELECT

Существует ли возможность передать подзапрос в параметр процедуры?
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553028
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯНХНП!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553054
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Иными словами необходимо выполнить что-то типа

Нет, нужно позвать программиста, который умеет считать среднее не только с помощью avg().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553064
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Как решить задачу я знаю, и без avg тоже.
Но хочу спросить, "Существует ли возможность передать подзапрос в параметр процедуры?"
Чтоб процедура SP1 параметр ID получала подзапросом и возвращала набор данных,
объедененный из последовательно выполненых SP1 с каждым ID из подзапроса
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553074
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Существует ли возможность передать подзапрос в параметр процедуры?
нет.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553143
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983,

Ну возможно EXECUTE STATEMENT поможет
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553148
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

не поможет. ему надо resultset передать как параметр процедуры. А резалтсетов в качестве переменных в ФБ нет. Есть курсоры, но это типа тот же фор селект, с последовательным (или нет) перебором записей по одной штуке.

Чудится мне, что человек гланды через зад пытается удалить.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553150
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983,

Внешний select может вернуть список ID через запятую (см. LIST), а этот список потом уже парсится

Парсим такой процедурой
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
create or alter procedure LISTTOID (
    STR blob,
    L varchar(5) = ',')
returns (
    N integer,
    CODE bigint)
AS
declare variable p int = -1;
declare variable t int = 1;
declare variable l1 int;
declare variable cc varchar(20);
declare variable nums varchar(16) = '[-+]?[0-9]{1,19}';
begin
  N = 1;
  l1 = char_length(l);
  while (p <> 0) do
  begin
    p = position(l, str, t);
    if (p = 0) then
      cc = left(substring(str from t), 20);
    else
      cc = left(substring(str from t for p-t), 20);
    if (cc similar to nums) then
    begin
      code = cc;
      suspend;
      N = N + 1;
    end
    t = p + l1;
  end
end



Далее в процедуре делаем что-то подобное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or alter procedure sp1 (
    id blob)
returns (
    a int,
    b int,
    c int,
    d int)
AS
begin
  for select avg(a), avg(b), avg(c), avg(d) from listtoid(:id) l
      left join table1 t on t.id = l.code
  into a, b, c, d do
    suspend;
end
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЧудится мне, что человек гланды через зад пытается удалить.

Просто дурная привычка с какого-нибудь MS SQL-я всё делать через процедуры...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553161
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvm7m,

не поможет. ему надо resultset передать как параметр процедуры. А резалтсетов в качестве переменных в ФБ нет.
Ну тогда использовать временную таблицу
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553164
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m,
m7m Ну возможно EXECUTE STATEMENT поможет
Вариант, хотя мне проще дополнительно в for select обенуть


Шавлюк Евгений,
Шавлюк Евгений Парсим такой процедурой
Спасибо за вариант, рассмотрю



Dimitry SibiryakovПросто дурная привычка с какого-нибудь MS SQL-я всё делать через процедуры...

На мой взгляд процедуры - это удобно и красиво.
Даже если использовать как сохраненные запросы и не более того.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553182
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С "удобно и красиво" люди на форум не ходят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553259
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже все гранаты выдали? И екзекьют, и кривой лист.

kaktus1983На мой взгляд процедуры - это удобно и красиво.
Блендер - это тоже удобно и красиво. Но тесто им замешивать неудобно.

"Всё процедурами" и "всё чистым sql" - это как холодная и горячая вода, надо смешивать в требуемой пропорции.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553374
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНет, нужно позвать программиста, который умеет считать среднее не только с помощью avg().

можно и AVG, если GTT
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553393
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983если использовать как сохраненные запросы

для этого VIEW есть, они оптимизатор не убивают
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553396
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvkaktus1983Существует ли возможность передать подзапрос в параметр процедуры?
нет.

можно per-transaction GTT заполнять

на каждую процедуру - свои входящие GTT, параметры в глобальных переменных - это моветон, но что делать
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553413
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochможно и AVG, если GTT

AVG можно и без GTT, но аффтар же тогда укрепится в своей решимости натирать геморрой
кривыми костылями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553531
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы костыля были корявистее и кучнее - погрызть гранит в эту сторону если?

Код: sql
1.
2.
3.
4.
5.
SELECT T.ID, avg(P.A), avg(P.B), avg(P.C), avg(P.D) 
FROM TABLE1 T
JOIN ( SELECT * FROM SP1 (T.ID)) P
WHERE /* условия по T */
GROUP BY T.ID



Так в лоб, наверное, не получится, но вот если бы SELECT позволял запрашивать из процедуры INPUT-параметры - JOIN ( SELECT * FROM SP1 (T.ID)) P ON P.INPUT_ID = T.ID
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553550
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вот интересно, что за вычисления такие в процедуре SP1 происходят, а то вдруг их можно в запросе сделать.
Выборка из одной-единственной таблицы, даже соединять ничего не надо.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553657
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSeryМне вот интересно, что за вычисления такие в процедуре SP1 происходят, а то вдруг их можно в запросе сделать.
Выборка из одной-единственной таблицы, даже соединять ничего не надо.

WildSery,
может и можно, оцените сами.
Главная причина, вынесение кода в отдельную SP1, это то, что вычисления вызываются из различных мест БД, и при изменении алгоритма логично менять только в одном месте, в SP1.
SP1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
create or alter procedure SP1 (
    ID integer,
    NO_CL smallint)
returns (
    A DOM_FLOAT_Q,
    B DOM_FLOAT_Q,
    C DOM_FLOAT_Q,
    D DOM_FLOAT_Q)
as
declare variable T0 type of column INPUT_HOUR_DATA.T_IN_01;
declare variable T1 type of column INPUT_HOUR_DATA.T1_CL_03;
declare variable T2 type of column INPUT_HOUR_DATA.T2_CL_03;
declare variable T3 type of column INPUT_HOUR_DATA.T3_CL_03;
declare variable T4 type of column INPUT_HOUR_DATA.T4_CL_03;
declare variable FV type of column INPUT_HOUR_DATA.FL_CL_03;
declare variable KOEF DOM_FLOAT_3;
declare variable DT_ type of column INPUT_HOUR_DATA.T1_CL_03;
declare variable DT10 type of column INPUT_HOUR_DATA.T1_CL_03;
declare variable DT21 type of column INPUT_HOUR_DATA.T1_CL_03;
declare variable DT32 type of column INPUT_HOUR_DATA.T1_CL_03;
declare variable DT43 type of column INPUT_HOUR_DATA.T1_CL_03;
begin
   KOEF = (select Q_KOEF_WT_KKAL from main_const where (id = 0));
   select (t_in_01 + t_in_02 + t_in_03 + t_in_04 + t_in_05 + t_in_06) / 6 from input_hour_data where (id = :id)  into :t0;     -- dafault

   if ((:no_cl>= 3) and (:no_cl<=27)) then  -- ДЛЯ 03-27 РАСЧЕТ ТИПОВОЙ
      begin
         select tin from MODEL_CALC_TIN_BY_CL (:id, 1, :no_cl) into :t0;

         -- Выбор параметров
         if (:no_cl=03) then  select FL_CL_03, T1_CL_03, T2_CL_03, T3_CL_03, T4_CL_03 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=04) then  select FL_CL_04, T1_CL_04, T2_CL_04, T3_CL_04, T4_CL_04 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=05) then  select FL_CL_05, T1_CL_05, T2_CL_05, T3_CL_05, T4_CL_05 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=06) then  select FL_CL_06, T1_CL_06, T2_CL_06, T3_CL_06, T4_CL_06 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=07) then  select FL_CL_07, T1_CL_07, T2_CL_07, T3_CL_07, T4_CL_07 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=08) then  select FL_CL_08, T1_CL_08, T2_CL_08, T3_CL_08, T4_CL_08 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=09) then  select FL_CL_09, T1_CL_09, T2_CL_09, T3_CL_09, T4_CL_09 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=10) then  select FL_CL_10, T1_CL_10, T2_CL_10, T3_CL_10, T4_CL_10 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=11) then  select FL_CL_11, T1_CL_11, T2_CL_11, T3_CL_11, T4_CL_11 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=12) then  select FL_CL_12, T1_CL_12, T2_CL_12, T3_CL_12, T4_CL_12 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=13) then  select FL_CL_13, T1_CL_13, T2_CL_13, T3_CL_13, T4_CL_13 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=14) then  select FL_CL_14, T1_CL_14, T2_CL_14, T3_CL_14, T4_CL_14 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=15) then  select FL_CL_15, T1_CL_15, T2_CL_15, T3_CL_15, T4_CL_15 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=16) then  select FL_CL_16, T1_CL_16, T2_CL_16, T3_CL_16, T4_CL_16 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=17) then  select FL_CL_17, T1_CL_17, T2_CL_17, T3_CL_17, T4_CL_17 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=18) then  select FL_CL_18, T1_CL_18, T2_CL_18, T3_CL_18, T4_CL_18 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=19) then  select FL_CL_19, T1_CL_19, T2_CL_19, T3_CL_19, T4_CL_19 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=20) then  select FL_CL_20, T1_CL_20, T2_CL_20, T3_CL_20, T4_CL_20 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=21) then  select FL_CL_21, T1_CL_21, T2_CL_21, T3_CL_21, T4_CL_21 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=22) then  select FL_CL_22, T1_CL_22, T2_CL_22, T3_CL_22, T4_CL_22 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=23) then  select FL_CL_23, T1_CL_23, T2_CL_23, T3_CL_23, T4_CL_23 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=24) then  select FL_CL_24, T1_CL_24, T2_CL_24, T3_CL_24, T4_CL_24 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=25) then  select FL_CL_25, T1_CL_25, T2_CL_25, T3_CL_25, T4_CL_25 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=26) then  select FL_CL_26, T1_CL_26, T2_CL_26, T3_CL_26, T4_CL_26 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=27) then  select FL_CL_27, T1_CL_27, T2_CL_27, T3_CL_27, T4_CL_27 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;

         -- расчет 

         -- ПРОВЕРКИ и ВООСТАНОВЛЕНИЕ НЕРАБОТАЮЩИХ
         -- Для всех холодильников  проверка на наличие нуля
         if ((:T1 <= 0) and (:T0 > 0) and (:T2 > 0)) then T1 = (T0 + T2) / 2;
         if ((:T2 <= 0) and (:T1 > 0) and (:T3 > 0)) then T2 = (T1 + T3) / 2;
         if ((:T3 <= 0) and (:T2 > 0) and (:T4 > 0)) then T3 = (T2 + T4) / 2;
         -- Для температур Т1, Т2 и Т3 проверка чтоб не было Тi < Тi-1
         if (:T1 <= :T0) then T1 = (T0 + T2) / 2;
         if (:T2 <= :T1) then T2 = (T1 + T3) / 2;
         if (:T3 <= :T2) then T3 = (T2 + T4) / 2;
         if (:T3 <= :T2) then T2 = (T1 + T3) / 2;
         -- Корректировка перепадов
         dT10 =       T1 - T0;
         dT21 =       T2 - T1;
         dT32 =       T3 - T2;
         dT43 = ABS (:T4 -:T3 );
         -- Корректировка перепадов
         if (:dT32 < 0.000) then dT32 = 0;
         if (:dT21 > :dT10) then dT21 = ( dT10 + dT32 ) / 2;
         if (:dT32 > :dT10) then dT32 = dT32 / 2;
                                 dT_  = ( dT10 + dT21 + dT32 ) / 3;
         if (:dT21 < 0.200) then dT21 = dT_;
         if (:dT32 < 0.200) then dT32 = dT_;
         if (:dT32 > :dT10) then dT32 = dT32 / 2;
         if (:dT43 > :dT32) then dT43 = dT43 / 2;

         -- Расчет по формулам
         D = 3 * KOEF * fv * ( dT10 - ( dT21 + dT32 ) / 2 );                 -- D = 3 * KOEF * 1 * fv * (T0 + T3);
         C = 3 * KOEF * fv * dT21;                                           -- C = 3 * KOEF * 2 * fv * (T1 + T2 - T0 - T3);
         B = 3 * KOEF * fv * dT32;                                           -- B = 3 * KOEF * 2 * fv * (T3 - T2);
         A = 3 * KOEF * fv * dT43;                                           -- A = 3 * KOEF * 1 * fv * (T4 - T3);
      end
   else                -- ДЛЯ TH
      begin
         -- ВГ ВЛ НЛ 
         if (:no_cl=28) then   select FV_CL_28, T1_CL_28, T2_CL_28, FV_VG_28, T1_VG_28 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=29) then   select FV_CL_29, T1_CL_29, T2_CL_29, FV_VG_29, T1_VG_29 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=30) then   select FV_CL_30, T1_CL_30, T2_CL_30, FV_VG_30, T1_VG_30 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=31) then   select FV_CL_31, T1_CL_31, T2_CL_31, FV_VG_31, T1_VG_31 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=32) then   select FV_CL_32, T1_CL_32, T2_CL_32, FV_VG_32, T1_VG_32 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=01) then   select FV_CL_01, T1_CL_01, T2_CL_01, FV_VG_01, T1_VG_01 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
         if (:no_cl=02) then   select FV_CL_02, T1_CL_02, T2_CL_02, FV_VG_02, T1_VG_02 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;

         if (:T1 <= 0) then T1 = ( T0 + T2 ) / 2;  -- ПРОВЕРКИ и ВООСТАНОВЛЕНИЕ НЕРАБОТАЮЩИХ

         select tin from MODEL_CALC_TIN_BY_CL (:id, 4, :no_cl) into :t0;  D = 1 * KOEF * T3 *    ( T4 -  T0);                     -- D = KOEF * T3 * (T4 - T0);
         select tin from MODEL_CALC_TIN_BY_CL (:id, 2, :no_cl) into :t0;  B = 3 * KOEF * fv *    ( T1 -  T0);                     -- B = KOEF * fv * (T1 - T0);
         select tin from MODEL_CALC_TIN_BY_CL (:id, 1, :no_cl) into :t0;  A = 3 * KOEF * fv * abs(:T2 - :T1);                     -- A = KOEF * fv * (T2 - T1);

         -- НГ (для семи по-разному)
         select tin from MODEL_CALC_TIN_BY_CL (:id, 3, :no_cl) into :t0;
         if (:no_cl=28) then   C = (select :KOEF * fv_ng_28 * (t1_ng_28 - :t0) from input_hour_data where (id = :id));
         if (:no_cl=29) then   C = (select :KOEF * ( (fv_th_29_1 * (t1_th_29_1 - :t0)) +
                                                     (fv_th_29_2 * (t1_th_29_2 - :t0)) ) from input_hour_data where (id = :id));
         if (:no_cl=30) then   C = (select :KOEF * ( (fv_th_30_1 * (t1_th_30_1 - :t0)) +
                                                     (fv_th_30_2 * (t1_th_30_2 - :t0)) ) from input_hour_data where (id = :id));
         if (:no_cl=31) then   C = maxvalue ( (select :KOEF * (fv_ng_31_1 * (t1_ng_31_1 - :t0)) from input_hour_data where (id = :id)) ,
                                              (select :KOEF * (fv_ng_31_2 * (t1_ng_31_2 - :t0)) from input_hour_data where (id = :id))  );
         if (:no_cl=32) then   C = (select :KOEF * ( (fv_th_32_1 * (t1_th_32_1 - :t0)) +
                                                        (fv_th_32_2 * (t1_th_32_2 - :t0)) ) from input_hour_data where (id = :id));
         if (:no_cl=01) then   C = (select :KOEF * ( (fv_th_01_1 * (t1_th_01_1 - :t0)) +
                                                        (fv_th_01_2 * (t1_th_01_2 - :t0)) ) from input_hour_data where (id = :id));
         if (:no_cl=02) then   C = (select :KOEF * fv_ng_02 * (t1_ng_02 - :t0) from input_hour_data where (id = :id));
      end

   suspend;

end


...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553675
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всю эту хрень построенную на if-ах заменить одним select-ом с case-ми
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553709
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийвсю эту хрень построенную на if-ах заменить одним select-ом с case-миЭдак ты замахнешься на святое, убрать нахрен широченную горизонтальную портянку, тогда и ифы с кейзами совсем не понадобятся.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553813
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

мне кажется, гемор тут из-за дурацкой структуры таблиц.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553815
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.11.2017 18:25, kdv пишет:
> мне кажется, гемор тут из-за дурацкой структуры таблиц.

я так глубоко не ковырял.
так, палочкой потыкал... (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553929
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kaktus1983есть процедура SP1, которая, получая на вход ID некой таблицы TABLE1, возвращает строго 1 запись, поля A, B, C, D.
в процедуре SP2 необходимо выполнить усреднение рассчитанных параметров A, B, C, D за определенный период записей из TABLE1.
Иными словами необходимо выполнить что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
for 
  SELECT ID FROM TABLE1
  WHERE ...
  INTO :ID 
do
...
select avg(A), avg(B), avg(C), avg(D) from SP1 (:ID) into...


где :ID это массив записей, который вернул внешний SELECT
Существует ли возможность передать подзапрос в параметр процедуры?
Компактный вариант решения:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
       avg ( (select A from SP1 (id)) ),
       avg ( (select B from SP1 (id)) ),
       avg ( (select C from SP1 (id)) ),
       avg ( (select D from SP1 (id)) )
FROM TABLE1 
WHERE ...
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553945
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Компактный вариант решения:

За такое в продакшене увольняют по несоотвествию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553947
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevskyубрать нахрен широченную горизонтальную портянку
решил на ночь посмотреть фильм ужасов.
Как я понял, в таблице input_hour_data по 32 столбца
FL_CL_??, T1_CL_??, T2_CL_??, T3_CL_??, T4_CL_??, T1_VG_??, FV_VG_??
ну или большинство по 32 столбца (или 27), и меньшинство по 7 столбцов.

Это какой-то кабздец, товарищи. 150 столбцов, как минимум? Однако, до предела не доехал
https://firebirdsql.org/en/firebird-technical-specifications/
Maximum number of columns per table
Depends on data types used. (Example: 16,384 INTEGER (4-byte) values per row.)

я так понимаю, перед автором стояла задача - или заливать херову пропасть значений в одну строку, или получить в n (5?) раз больше записей.
А скорее всего с датчиков с самого начала стали просто валить все в одну запись. А чё с этим делать - "потом разберемся".
Однако, правила разработки БД:
1. определяем типы и структуры хранимых данных (входящих) по исходным данным
2. смотрим, как мы это будем обрабатывать и извлекать
3. если на этапе 2 кривизна, возвращаемся к пункту 1.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553972
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvА скорее всего с датчиков с самого начала стали просто валить все в одну запись. А чё с этим делать - "потом разберемся".
Однако, правила разработки БД:
1. определяем типы и структуры хранимых данных (входящих) по исходным данным
2. смотрим, как мы это будем обрабатывать и извлекать
3. если на этапе 2 кривизна, возвращаемся к пункту 1.


Я смотрю тут все стали такие академичные :)

А если было так - вот у нас система, есть 3 датчика, нужно автоматизировать.
Нет, больше датчиков не будет.

Через год.
У нас тут появилось еще 100-500 датчиков, нужно и с них снимать показания тоже.
И да, это нужно уже вчера.

Вместо того что бы шагать по новым граблям с неопределенным сроком реализации,
экстенсивно расширяем уже работающее решение, и работаем дальше.
Да, недостатки есть, как и везде. Разберемся по ходу дела, главное продашкн что бы работал.
Обычное дело.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39553973
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийвсю эту хрень построенную на if-ах заменить одним select-ом с case-ми


Может быть это кому-то будет красивее, может это что-то улучшит в оптимизации, но эта часть работает и не является камнем преткновения.
Чувство красоты у каждого разное.
Из перлов состоит только перловая каша.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554015
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> Из перлов состоит только перловая каша.

В мемориз! (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554023
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Вы довольно точно описали ситуацию, у меня аналогичное мнение.
К сожалению, от гуру часто получаешь не советы и варианты решения, а только критиканство
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554051
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда ты "гуру" с первого сообщения сразу ставишь в рамки своего видения решения поставленной задачи не описывая собственно постановку, ты ничего иного и не получишь. Ибо если ты уже встал на неверный путь при наличии более правильных вариантов решения, то ни один гуру тебе не укажет правильного, т.к. ты описал только свой путь, который может быть уже неверным.
Посему вопросы в стиле "мне надо что-то типа такого" без описания собственно начальной постановки задачи в виде взаимодействия физических объектов и их представления в виде таблиц ни к чему путному не приведут.

Это так к слову.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554099
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийвсю эту хрень построенную на if-ах заменить одним select-ом с case-ми

Кстати, она от этого займет больше строчек чем сейчас.

Код: plsql
1.
2.
3.
4.
-- Выбор параметров
if (:no_cl=03) then  select FL_CL_03, T1_CL_03, T2_CL_03, T3_CL_03, T4_CL_03 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
if (:no_cl=04) then  select FL_CL_04, T1_CL_04, T2_CL_04, T3_CL_04, T4_CL_04 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
if (:no_cl=05) then  select FL_CL_05, T1_CL_05, T2_CL_05, T3_CL_05, T4_CL_05 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select
 case 
   when (:no_cl = 03) then FL_CL_03
   when (:no_cl = 04) then FL_CL_04
   when (:no_cl = 05) then FL_CL_05
  end,
  case 
   when (:no_cl = 03) then T1_CL_03
   when (:no_cl = 04) then T1_CL_04
   when (:no_cl = 05) then T1_CL_05
  end,
  case 
   when (:no_cl = 03) then T2_CL_03
   when (:no_cl = 04) then T2_CL_04
   when (:no_cl = 05) then T2_CL_05
  end,
  case 
   when (:no_cl = 03) then T3_CL_03
   when (:no_cl = 04) then T3_CL_04
   when (:no_cl = 05) then T3_CL_05
  end,
  case 
   when (:no_cl = 03) then T4_CL_03
   when (:no_cl = 04) then T4_CL_04
   when (:no_cl = 05) then T4_CL_05 
  end
from input_hour_data 
where (id = :id) 
into :fv, :t1, :t2, :t3, :t4;



Наглядно видно что нифига лучше не стало.
Каков будет твой вариант?
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554116
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> Каков будет твой вариант?

Какие фаши таказательства? (с)

Нет смысла обсуждать сферического коня в гипотетическом вакууме,
надо задачу нормально поставить и обмозговать, а потом бросаться
лабать ХП и запросы (возможно, у автора нет такой возможности, ибо
горит и нужно вчера). 24 часа (насколько я понял), конечно, довольно
пограничный случай, но я бы, в первую очередь, подумал о том, чтобы
хранить всю эту портянку не в ширину (в 24 поля), а в высоту - запросы
стали бы сложнее, конечно, но не такие спагетти-подобные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554126
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o_v_a,
Не всегда вопрос можно поставить глобально: если на данный момент, по ряду причин "имеем что имеем" и требуется помощь в локальном решении, то вопрос в стиле "мне надо что-то типа такого" вполне уместен (на мой взгляд, конечно).
Возвращаться к вопросу перепроектировки БД при любой "сложности" можно бесконечно.
P.S.
Всем спасибо за замечания и предложения
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554148
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамfraks> Каков будет твой вариант?

Какие фаши таказательства? (с)

Нет смысла обсуждать сферического коня в гипотетическом вакууме,

Мимопроходящий высказался по поводу широкой пачки if и сказал что лучше свернуть в один запрос с case.
И именно это утверждение я рассмотрел, а не сферы в вакуууме.
В моем варианте и по моим понятиям - лучше не стало.

Преложил показать свои варианты.
МП, как обычно, "выше этого".

Лично для меня, когда запрос целиком по высоте не помещается на экране - очень некомфортно, теряется обзорность структуры процедуры. А вот так в ширину - тостаточно рассмотреть только один запрос и проконтролировать изменения индексов в строках. Расположено все друг над другом, проверять легко.

Гаджимурадов Рустамнадо задачу нормально поставить и обмозговать, а потом бросаться
лабать ХП и запросы (возможно, у автора нет такой возможности, ибо
горит и нужно вчера). 24 часа (насколько я понял), конечно, довольно
пограничный случай, но я бы, в первую очередь, подумал о том, чтобы
хранить всю эту портянку не в ширину (в 24 поля), а в высоту - запросы
стали бы сложнее, конечно, но не такие спагетти-подобные.

Честно говоря, не горю желанием разбираться в вопросе ТС.
Однако и критика ТС со стороны присутствующих иногда весьма неконструктивна.
Что и пытался рассмотреть.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554184
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.11.2017 11:04, fraks пишет:
> В моем варианте и по моим понятиям - лучше не стало.

мои труды читать надо!
(С)-проф.Выбегалло Амвросий Амбруазович

а ты до конца не дочитал.
всю эту хрень заменить одним ЗАПРОСОМ, на case-ах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554250
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksЛично для меня, когда запрос целиком по высоте не помещается на экране - очень некомфортно, теряется обзорность структуры процедуры. А вот так в ширину - тостаточно рассмотреть только один запрос и проконтролировать изменения индексов в строках. Расположено все друг над другом, проверять легко.

Честно говоря, не горю желанием разбираться в вопросе ТС.
Портянки в ширину, конечно, удобнее смотреть и править, чем в высоту (хотя и case можно в ширину писать, в принципе), но оптимальность решения же не только от комфорта для глаз зависит. :) Без желания разбираться в проблеме ТСа (у меня и у самого его особо нет) - это досужие разговоры в стиле "как подбирать калор" и "зеленый лисапед лучше желтого".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554357
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий16.11.2017 11:04, fraks пишет:
> В моем варианте и по моим понятиям - лучше не стало.

мои труды читать надо!
(С)-проф.Выбегалло Амвросий Амбруазович

а ты до конца не дочитал.
всю эту хрень заменить одним ЗАПРОСОМ, на case-ах.


Если на твоем языке процедура называется "ВСЯ ЭТА ХРЕНЬ" и предлагаешь ее завернуть в один запрос с case - то получится полный алес капут. В нынешнем виде ее можно нормально отладить, и быть уверенным в результатах котрые она выдает.
В виде развесистого запроса малейшее неверное движение в сторону - и получим гавно вместо результата.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554361
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

Лично мне отлаживать такое даже не хочется.
Хотя бы уж в ES завернуть, и то приятнее глазу будет.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554366
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.11.2017 14:23, fraks пишет:
> В виде развесистого запроса малейшее неверное движение в сторону...

— А эта бредятина откуда?
— Изречения из «Упанишад».
— А что такое «Упанишады»?
— Не знаю…

(C)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554752
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksВ виде развесистого запроса малейшее неверное движение в сторону - и получим гавно вместо результата.

В виде развесистого запроса при малейшем движении в сторону максимум что мы можем получить - изменение плана. Причём в 70% случаев в сторону улучшения быстродействия. А процедура как долбила тупо всё подряд, так и будет. Не, я не противник селективных процедур как таковых, дело всегда в нюансах.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554781
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаfraksВ виде развесистого запроса малейшее неверное движение в сторону - и получим гавно вместо результата.

В виде развесистого запроса при малейшем движении в сторону максимум что мы можем получить - изменение плана. Причём в 70% случаев в сторону улучшения быстродействия. А процедура как долбила тупо всё подряд, так и будет. Не, я не противник селективных процедур как таковых, дело всегда в нюансах.

Да?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
  SELECT T.*, 
         - DATEDIFF(day, @EndDate + 1, CASE WHEN @StartDate > T.ItemDate
                                              THEN @StartDate
                                              ELSE T.ItemDate END) 
         * T.Amount * @PayPercent * T.[Index] / 100 AS Income
  FROM ( SELECT T1.*, (SELECT -SUM(CASE WHEN MM.Direction = 0 AND O.TypeId <> @TAccount
                                          THEN MM.DirAmount
                                        WHEN MM.Direction = 1 AND H2.Id IS NOT NULL
                                          THEN DirAmount
                                          ELSE 0 END)
    FROM Movement MM WITH(INDEX(IN_Movement_GroupIdContentId))
      LEFT LOOP JOIN Objects O ON O.Id = MM.ContainerId
      LEFT LOOP JOIN History H2 ON H2.ObjectId = MM.ContainerId AND
H2.StatusId IN (@IODate, @ITDate) AND H2.ObjectId = MM.ContainerId AND
H2.ItemDate < @EndDate + 1
    WHERE MM.GroupId = T1.Id AND MM.ContentId = @Roubles
  ) AS Amount
  FROM (
  SELECT M.GroupId AS Id,
         H2.ItemDate,
         D.DocNum,
         OT.ItemName AS Type,
         OC.Itemname AS Contractor,
         OC.Id AS ContractorId,
         OM.ItemName AS Manager,
         PInd.Value AS [Index]
    FROM History H
      INNER LOOP JOIN Movement M WITH(INDEX(IN_Movement_ContainerId))
                      ON M.ContainerId = H.ObjectId 
                     AND M.ContentId = @Roubles
      INNER LOOP JOIN Objects O1
                      ON O1.Id = M.GroupId 
                     AND O1.TypeId IN (@CashOrder, @DraftIn)
      INNER JOIN Links L ON L.ChildId = M.GroupId 
                        AND L.TypeId = @Contractor
      INNER JOIN Links LM ON LM.ChildId = L.ParentId 
                         AND LM.TypeId = @Manager 
                         AND ISNULL(@ManagerId, LM.parentId) = LM.parentId
      INNER JOIN History H2 ON H2.ObjectId = M.GroupId 
                           AND H2.ItemDate < @EndDate + 1
      INNER JOIN Status S2 ON S2.Id = H2.StatusId 
                          AND S2.Code = 'DATE'
      INNER JOIN History H1 ON H1.ObjectId = M.ContainerId
      INNER JOIN Status S ON S.Id = H1.StatusId 
                         AND S.Code = 'PAYDATE'
      INNER LOOP JOIN Objects OM ON OM.Id = LM.parentId
      INNER LOOP JOIN Objects OC ON OC.Id = L.ParentId
      LEFT LOOP JOIN Properties PInd ON PInd.ObjectId = OC.Id 
                                    AND PInd.TypeId = @Index
      INNER LOOP JOIN Doc D ON D.Id = M.GroupId
      INNER LOOP JOIN Objects O ON O.Id = M.GroupId
      INNER LOOP JOIN ObjType OT ON OT.Id = O.TypeId
   WHERE H.StatusId IN (@IODate, @ITDate) AND H.Itemdate >= @EndDate + 1
     AND (H2.StatusId = @CODate OR EXISTS(SELECT TOP 1 * FROM MoveLink ML
                                           INNER JOIN History HL ON HL.ObjectId = ML.ObjectId
                                           INNER JOIN Status SL ON SL.Id = HL.StatusId 
                                                               AND SL.GroupId = @AccType 
                                                               AND SL.Code IN ('BANK', 'VEXELMANY')
                                          WHERE ML.MoveId = M.Id 
                                            AND ML.TypeId = @Account))
     AND NOT EXISTS (SELECT TOP 1 * FROM History 
                       WHERE ObjectId = H2.ObjectId AND StatusId = @Tender)
  UNION
  SELECT LMP.ChildId AS Id,
         H2.ItemDate AS DocDate,
         D.DocNum,
         OT.ItemName AS DocType,
         OC.Itemname AS Contractor,
         OC.Id AS ContractorId,
         OM.ItemName AS Manager,
         PInd.Value AS [Index]
    FROM Objects O
      INNER LOOP JOIN Links LM ON LM.ChildId = O.Id AND LM.TypeId = @Manager
AND ISNULL(@ManagerId, LM.parentId) = LM.parentId
      INNER LOOP JOIN Links LMP ON LMP.TypeId = @MustCompl AND LMP.ParentId
= O.Id
      INNER LOOP JOIN Objects O1 ON O1.Id = LMP.ChildId AND O1.TypeId IN
(@InvoiceOut, @InvoiceTr)
      INNER LOOP JOIN History H1 ON H1.ObjectId = O1.Id AND H1.ItemDate <
@EndDate + 1
      INNER LOOP JOIN Status S ON S.Id = H1.StatusId AND S.Code = 'PAYDATE'
      INNER JOIN History H2 ON H2.ObjectId = LMP.ChildId AND H2.ItemDate <
@EndDate + 1
      INNER JOIN Status S2 ON S2.Id = H2.StatusId AND S2.Code = 'DATE'
      INNER LOOP JOIN Doc D ON D.Id = O1.Id
      INNER LOOP JOIN ObjType OT ON OT.Id = O1.TypeId
      INNER JOIN Objects OM ON OM.Id = LM.parentId
      INNER JOIN Objects OC ON OC.Id = O.Id
      LEFT LOOP JOIN Properties PInd ON PInd.ObjectId = OC.Id AND
PInd.TypeId = @Index
   WHERE O.TypeId = @Firm
     AND NOT EXISTS (SELECT TOP 1 * FROM History WHERE ObjectId =
LMP.ChildId AND StatusId = @Tender)
     AND (O1.TypeId = @InvoiceTr OR EXISTS (SELECT TOP 1 *
                                              FROM Links L
                                                INNER LOOP JOIN History H ON
H.ObjectId = L.ParentId
                                                INNER LOOP JOIN Status S ON
S.Id = H.StatusId AND S.GroupId = @CalcStyle AND S.Code IN
('CSDELAY','CSCASH','CSPREPAY')
                                             WHERE L.ChildId = O1.Id AND
L.TypeId = @InvQueryOut
                                           ))
  ) AS T1
  ) AS T
  ORDER BY T.Manager, T.Itemdate, T.DocNum


...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554811
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksМимопроходящийвсю эту хрень построенную на if-ах заменить одним select-ом с case-ми

Кстати, она от этого займет больше строчек чем сейчас.

Код: plsql
1.
2.
3.
4.
-- Выбор параметров
if (:no_cl=03) then  select FL_CL_03, T1_CL_03, T2_CL_03, T3_CL_03, T4_CL_03 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
if (:no_cl=04) then  select FL_CL_04, T1_CL_04, T2_CL_04, T3_CL_04, T4_CL_04 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;
if (:no_cl=05) then  select FL_CL_05, T1_CL_05, T2_CL_05, T3_CL_05, T4_CL_05 from input_hour_data where (id = :id) into :fv, :t1, :t2, :t3, :t4;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select
 case 
   when (:no_cl = 03) then FL_CL_03
   when (:no_cl = 04) then FL_CL_04
   when (:no_cl = 05) then FL_CL_05
  end,
  case 
   when (:no_cl = 03) then T1_CL_03
   when (:no_cl = 04) then T1_CL_04
   when (:no_cl = 05) then T1_CL_05
  end,
  case 
   when (:no_cl = 03) then T2_CL_03
   when (:no_cl = 04) then T2_CL_04
   when (:no_cl = 05) then T2_CL_05
  end,
  case 
   when (:no_cl = 03) then T3_CL_03
   when (:no_cl = 04) then T3_CL_04
   when (:no_cl = 05) then T3_CL_05
  end,
  case 
   when (:no_cl = 03) then T4_CL_03
   when (:no_cl = 04) then T4_CL_04
   when (:no_cl = 05) then T4_CL_05 
  end
from input_hour_data 
where (id = :id) 
into :fv, :t1, :t2, :t3, :t4;



Наглядно видно что нифига лучше не стало.
Каков будет твой вариант?

Оно можно и так написать -
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 case :no_cl when 03 then FL_CL_03 when 04 then FL_CL_04 when 05 then FL_CL_05 end,
 case :no_cl when 03 then T1_CL_03 when 04 then T1_CL_04 when 05 then T1_CL_05 end,
 case :no_cl when 03 then T2_CL_03 when 04 then T2_CL_04 when 05 then T2_CL_05 end,
 case :no_cl when 03 then T3_CL_03 when 04 then T3_CL_04 when 05 then T3_CL_05 end,
 case :no_cl when 03 then T4_CL_03 when 04 then T4_CL_04 when 05 then T4_CL_05 end,
from input_hour_data
where (id = :id) 
into :fv, :t1, :t2, :t3, :t4;


Но, ИМХО, те же яйцы.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554823
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

ну и какой смысл выкладывать сюда запрос из MS SQL да ещё с прибитыми гвоздём хинтами?
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554842
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksДа?Если уверен, что это развесистый запрос, то уж извини, но ты просто жизни не видел.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554873
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExterisОно можно и так написать -
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 case :no_cl when 03 then FL_CL_03 when 04 then FL_CL_04 when 05 then FL_CL_05 end,
 case :no_cl when 03 then T1_CL_03 when 04 then T1_CL_04 when 05 then T1_CL_05 end,
 case :no_cl when 03 then T2_CL_03 when 04 then T2_CL_04 when 05 then T2_CL_05 end,
 case :no_cl when 03 then T3_CL_03 when 04 then T3_CL_04 when 05 then T3_CL_05 end,
 case :no_cl when 03 then T4_CL_03 when 04 then T4_CL_04 when 05 then T4_CL_05 end,
from input_hour_data
where (id = :id) 
into :fv, :t1, :t2, :t3, :t4;


Но, ИМХО, те же яйцы.

Вот именно. Причем все же хуже - в столбцах тут разные поля, а в массиве IF меняется только номер поля, а буквы те же.
Гораздо проще увидеть косяк.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554874
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисfraks,

ну и какой смысл выкладывать сюда запрос из MS SQL да ещё с прибитыми гвоздём хинтами?

Пример развесистого запроса, не более того.
Когда я пытался повторить такую же структуру на Firebird - получалось примерно такая же развесистая клюква.
Зарубил эту схему нафиг, из-за сложности в понимании работы запросов.
Хотя есть люди которые с ней работают.
Запрос взят у Тенцера, 2001 году примерно.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554876
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryfraksДа?Если уверен, что это развесистый запрос, то уж извини, но ты просто жизни не видел.

У каждого своя жизнь и понимание уровня сложности.
Для меня он - сложный, и я не пишу того что мне же будет сложно понять.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554878
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забористо пятница началась... :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554890
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаА процедура как долбила тупо всё подряд, так и будет.

Лично для меня - это идеальный вариант, как протестировано так и работает.
А не так что ты тут заточился под текущий план, а потом налилось данных оптимизатор посчитал что он умнее и схватил не тот индекс.
И вместо сорта натуралом 10 записей мы выбираем по индексу десятки тысяч.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554896
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryfraksДа?Если уверен, что это развесистый запрос, то уж извини, но ты просто жизни не видел.
Ага, знавал я человека, который даже хвастался хранимками на mssql в 30к строк и запросами под тысячу. :)
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554935
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExterisWildSery > Если уверен, что это развесистый запрос, то уж извини, но ты просто жизни не видел.

Ага, знавал я человека, который даже хвастался хранимками на mssql в 30к строк и запросами под тысячу. :)
Как говорится, кому и кобыла невеста, нашли чем хвастаться...
Я когда вижу развесистые ХПшки более чем на 4 экрана в высоту -
уже начинаю "огорчаться", а уж когда они не свои, а чужие...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554971
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.11.2017 10:39, Exteris пишет:
> Ага, знавал я человека, который даже хвастался хранимками на mssql в 30к строк и запросами под тысячу. :)

эвон в дельфийском форуме надысь страдалец жаловался, что егойный запрос НЕ ЛЕЗЕТ в TADOQuery...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39554986
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExterisАга, знавал я человека, который даже хвастался хранимками на mssql в 30к строк и запросами под тысячу. :)Хранимки могут быть сколь угодно сложными, это на вкус автора.
Я имел в виду именно SQL запрос.
Приходится разбирать настолько сложные, составленные из вложенных, реализующие какую-то свою логику, что принципы функционирования в целом иногда ускользают из понимания.
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39555000
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> страдалец жаловался, что егойный запрос НЕ ЛЕЗЕТ в TADOQuery...

Не, у него несложный был, у него тупая копипаста длинного куска была.

WildSery> Приходится разбирать настолько сложные, составленные из вложенных

1С что ли?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос в параметре процедуры
    #39555120
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Да.
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапрос в параметре процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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