Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выходит ошибка в запросе / 17 сообщений из 17, страница 1 из 1
06.09.2021, 20:55
    #40095590
LMag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
Добрый вечер, есть запрос, запускаю его в ibexpert нормально отрабатывает.

Запускаю в программе, выходит ошибка, не пойму почему

Вот запрос

Код: 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.
select distinct(s.glpu) as glpu,
        Count(s.id_sluch) as cnt,
        sum(iif(s.id_povod<>'',1,0)) as def,
        sum(s.summa_v) as SumVOZV,
        sum(ROUND(s.summa_m,2)) as SumSHTRAF,
        sum(s.summa_disp) as SumDISP,
        sum(iif(s.usl_ok=4,s.summa_v,0)) smp,
        sum(iif(sp.t_type=4 or sp.t_type=44,s.summa_disp,0)) as disp1etap,
        sum(iif(sp.t_type=7,s.summa_disp,0)) as disp2etap,
        sum(iif(sp.t_type=3,s.summa_disp,0)) as dispds,
        sum(iif(sp.t_type=33,s.summa_disp,0)) as dispuds,
        sum(iif(sp.t_type=8,s.summa_disp,0)) as profmed,
        0 as vmp ,
        sum(Round(s.sp_sum,2)) as sp_sum
   from GET_SNK_ALL(:glpu,:date1,:date2) s
            left join sp_tarif sp on sp.ksg=s.code_usl
            left join vid_exp v on v.kod=s.tip_exp
    where s.tip=2 and :tip=v.tip_exp group by glpu

    union all

    select distinct(s.glpu) as glpu,
            Count(s.id_sluch) as cnt,
            sum(iif(s.id_povod<>'',1,0)) as def,
            sum(s.summa_v) as SumVOZV,
            sum(CAST(s.summa_m as numeric(9,2))) as SumSHTRAF,
            sum(s.summa_disp) as SumDISP,
            0 as smp,
            0 as disp1etap,
            0 as disp2etap,
            0 as dispds,
            0 as dispuds,
            0 as profmed,
            sum(s.vmp) as vmp,
            0 as sp_sum
    from GET_SNK_ALL(:glpu,:date1,:date2) s
        left join vid_exp v on v.kod=s.tip_exp

    where s.tip=1 and :tip=v.tip_exp group by glpu



Ощибка выходит следующая
...
Рейтинг: 0 / 0
06.09.2021, 21:27
    #40095595
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
LMag,

Такое впечатление, что где-то в процедуре идет склейка юнионов, и очень большая.
...
Рейтинг: 0 / 0
06.09.2021, 21:32
    #40095597
LMag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
YuRock,

Самое интересное, на одном компьютере работает, а на другом нет
...
Рейтинг: 0 / 0
06.09.2021, 21:54
    #40095601
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
Разные БД, разные процедуры.
...
Рейтинг: 0 / 0
06.09.2021, 23:19
    #40095611
LMag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
Код процедуры

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN
    k=0;
    FOR SELECT A.TABLENAME FROM alltables A INTO :TABLENAME DO
        BEGIN
            k=k+1;
            TABL=cast(tablename as varchar(10));
                begin
                    sql='select 2 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,ROUND(SP_SUM,2),ROUND(SUMMA_DISP,2),s.DATA_L,s.TIP_EXP, 0 as VMP,ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,0 as KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.prname AS PODR,u.code_usl from snk'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok LEFT JOIN PROFOT P ON P.IDPR=U.PROFIL where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G union all select 1 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,0 as SP_SUM,0 as SUMMA_DISP,s.DATA_L,s.TIP_EXP, ROUND(VMP,2),ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,s.KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.IOTD AS PODR,u.code_usl from snk_stac'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok left join stacotd p on (p.mcod=u.lpu_1 and p.kotd=u.podr) where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G';
                    for  EXECUTE STATEMENT (:Sql) (a := :date1,b:=:date2,G:=:GL) into :tip,:ID_SLUCH,:KSG,:KRAT,:ID_POVOD,:ID_EXP,:MCOD,:GLPU,:SP_SUM,:SUMMA_DISP,:DATA_L,:TIP_EXP, :VMP,:SUMMA_VOZM,:SUMMA_M,:SUMMA_V,:SUM_OPL,:DATA_EXP,:MKB,:KD,:ID_UT,:nhistory,:umpname,:comment,:id_pac,:usl_ok,:date_1,:date_2,:PODR,:code_usl do suspend; end
        END
END



Не пойму почему выходит данная ошибка

Процедуры тоже проверил, все нормально.

Ошибка почему выходит никак не пойму.
...
Рейтинг: 0 / 0
06.09.2021, 23:55
    #40095615
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
LMag
Код процедуры

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN
    k=0;
    FOR SELECT A.TABLENAME FROM alltables A INTO :TABLENAME DO
        BEGIN
            k=k+1;
            TABL=cast(tablename as varchar(10));
                begin
                    sql='select 2 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,ROUND(SP_SUM,2),ROUND(SUMMA_DISP,2),s.DATA_L,s.TIP_EXP, 0 as VMP,ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,0 as KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.prname AS PODR,u.code_usl from snk'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok LEFT JOIN PROFOT P ON P.IDPR=U.PROFIL where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G union all select 1 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,0 as SP_SUM,0 as SUMMA_DISP,s.DATA_L,s.TIP_EXP, ROUND(VMP,2),ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,s.KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.IOTD AS PODR,u.code_usl from snk_stac'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok left join stacotd p on (p.mcod=u.lpu_1 and p.kotd=u.podr) where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G';
                    for  EXECUTE STATEMENT (:Sql) (a := :date1,b:=:date2,G:=:GL) into :tip,:ID_SLUCH,:KSG,:KRAT,:ID_POVOD,:ID_EXP,:MCOD,:GLPU,:SP_SUM,:SUMMA_DISP,:DATA_L,:TIP_EXP, :VMP,:SUMMA_VOZM,:SUMMA_M,:SUMMA_V,:SUM_OPL,:DATA_EXP,:MKB,:KD,:ID_UT,:nhistory,:umpname,:comment,:id_pac,:usl_ok,:date_1,:date_2,:PODR,:code_usl do suspend; end
        END
END




Не пойму почему выходит данная ошибка

Процедуры тоже проверил, все нормально.

Ошибка почему выходит никак не пойму.
не должно компилиться.
...
Рейтинг: 0 / 0
07.09.2021, 00:05
    #40095616
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
YuRock
LMag
Код процедуры

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN
    k=0;
    FOR SELECT A.TABLENAME FROM alltables A INTO :TABLENAME DO
        BEGIN
            k=k+1;
            TABL=cast(tablename as varchar(10));
                begin
                    sql='select 2 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,ROUND(SP_SUM,2),ROUND(SUMMA_DISP,2),s.DATA_L,s.TIP_EXP, 0 as VMP,ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,0 as KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.prname AS PODR,u.code_usl from snk'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok LEFT JOIN PROFOT P ON P.IDPR=U.PROFIL where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G union all select 1 as tip,s.ID_SLUCH,KSG,KRAT,ID_POVOD,ID_EXP,S.MCOD,GLPU,0 as SP_SUM,0 as SUMMA_DISP,s.DATA_L,s.TIP_EXP, ROUND(VMP,2),ROUND(SUMMA_VOZM,2),ROUND(SUMMA_M,2),ROUND(SUMMA_V,2),ROUND(SUM_OPL,2),DATA_EXP,MKB,s.KD,ID_UT,t.nhistory,m.umpname,s.comment,t.id_pac,t.usl_ok,t.date_1,t.date_2,P.IOTD AS PODR,u.code_usl from snk_stac'||tabl||' s left join tt05s50'||tabl||' t on t.id_sluch_tt=s.id_sluch left join ut05s50'||tabl||' u on (u.id_sluch=s.id_sluch and u.idserv=s.id_ut) left join uslmp m on m.idump=t.usl_ok left join stacotd p on (p.mcod=u.lpu_1 and p.kotd=u.podr) where s.DATA_EXP BETWEEN :a and :b AND S.GLPU=:G';
                    for  EXECUTE STATEMENT (:Sql) (a := :date1,b:=:date2,G:=:GL) into :tip,:ID_SLUCH,:KSG,:KRAT,:ID_POVOD,:ID_EXP,:MCOD,:GLPU,:SP_SUM,:SUMMA_DISP,:DATA_L,:TIP_EXP, :VMP,:SUMMA_VOZM,:SUMMA_M,:SUMMA_V,:SUM_OPL,:DATA_EXP,:MKB,:KD,:ID_UT,:nhistory,:umpname,:comment,:id_pac,:usl_ok,:date_1,:date_2,:PODR,:code_usl do suspend; end
        END
END





Не пойму почему выходит данная ошибка

Процедуры тоже проверил, все нормально.

Ошибка почему выходит никак не пойму.
не должно компилиться.
А, не, вру.
...
Рейтинг: 0 / 0
07.09.2021, 00:21
    #40095618
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
LMagОшибка почему выходит никак не пойму.
прочитай еще раз сообщение об ошибке. Оно означает, что внутри процедуры, view или запроса нельзя "вызвать" больше 255 селектов.
А у тебя execute statement с разными таблицами в цикле. Таблиц, часом, не тыща штук?
...
Рейтинг: 0 / 0
07.09.2021, 00:54
    #40095619
LMag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
kdv,

Вызывается 19 раз в цикле.

Удивительно, что данный запрос работает на одном компьютере, а на другом выходит данная ошибка.
Хотя все одинаково.
Не пойму.
А так ошибку прочитал.
Но не пойму где там 255 вызовов select
...
Рейтинг: 0 / 0
07.09.2021, 00:59
    #40095620
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
kdv
прочитай еще раз сообщение об ошибке. Оно означает, что внутри процедуры, view или запроса нельзя "вызвать" больше 255 селектов.
А у тебя execute statement с разными таблицами в цикле. Таблиц, часом, не тыща штук?
Хоть десять тыщщ - это разные запросы с разными контекстами.

Но одна из этих таблиц может оказаться view и результирующий запрос в ES может наступить на данное ограничение. Тем более, что там union двух join из 5-ти таблиц каждый:

LMag
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
from 
snk'||tabl||' s 
left join tt05s50'||tabl||' t 
left join ut05s50'||tabl||' u 
left join uslmp m 
LEFT JOIN PROFOT P 

union all 

from 
snk_stac'||tabl||' s 
left join tt05s50'||tabl||' t 
join ut05s50'||tabl||' u 
left join uslmp m 
left join stacotd p 

...
Рейтинг: 0 / 0
07.09.2021, 00:59
    #40095621
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
LMag
Удивительно, что данный запрос работает на одном компьютере, а на другом выходит данная ошибка.
Хотя все одинаково.
Не всё. Ищи.
...
Рейтинг: 0 / 0
07.09.2021, 02:53
    #40095622
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
LMagХотя все одинаково.
Не пойму.
чтобы "всё было одинаково", нужно
- сравнить метаданные (isql -x ... >...) обоих баз.
- сравнить данные, на основе которых производится for select формирование ES.
это как минимум.
Потом - поскольку это вызов процедуры, и там for select suspend, наверняка процедура до exception что-то выдает.
И надо отловить, при каких входных параметрах процедуры происходит ошибка.

В общем, нормальная такая задача по отладке.
...
Рейтинг: 0 / 0
07.09.2021, 12:29
    #40095700
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
kdv,

трейсом поймать будет несложно.
...
Рейтинг: 0 / 0
07.09.2021, 13:51
    #40095732
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
hvlad
трейсом поймать будет несложно.
по идее ловить надо до трейса, банально в автономной транзакции фигачить в лог табличку строковую переменную "sql".
...
Рейтинг: 0 / 0
07.09.2021, 13:58
    #40095736
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
kdv
- сравнить метаданные (isql -x ... >...) обоих баз.

...об е их... :)
...
Рейтинг: 0 / 0
07.09.2021, 14:37
    #40095750
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
Ivan_Pisarevsky
hvlad
трейсом поймать будет несложно.
по идее ловить надо до трейса, банально в автономной транзакции фигачить в лог табличку строковую переменную "sql".
Можно и так. Но это же надо уметь :)
...
Рейтинг: 0 / 0
07.09.2021, 23:05
    #40095846
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выходит ошибка в запросе
Былое и думы.

Когда появляется ошибка по исчерпанию некоего лимита - всегда надо смотреть в данные. Не только когда "тута нету а тама есть", а вообще. Как я есть ретроград и консерватор, я бы сказал - имея в виду пересмотреть свой дизайн или принять дополнительные меры по организации процесса и просвещению пользователей. По-современному, по-молодёжному - чтобы потребовать от разработчиков добиться обслуживания любой ахинеи. Помнится, во времена далёкие, теперь почти былинные, когда на количество аргументов в IN было ограничение в полторы тыщи штук, один крендель достал меня с превышением этого лимита. Вскрытие показало следующее. Для запроса в интерфейсе была предоставлена возможность наложения условий фильтрации на ФСЕ , абсолютно все, атрибуты. Для строковых на starting-containing, для остальных диапазонные. И уж на совсем крайний случай совсем уж экзотической выборки - возможность натыкать пальчиком интересующие. В том числе совместно с фильтрующими ограничениями. Однако, следуя парадигме махрового российского еврея - русские программисты му**ки и потому что русские и потому что программисты, и обязательно напорют в своём коде и обманут бедного еврея - не ленился, игнорируя очевидное, натыкивать пальчиком за день тыщи по три записей тупо в диапазоне дат. Не, можно было последовать лозунгу "клиент всегда прав" и поднять бучу. Но, как я тоже есть российский еврей на 1/8, предпочёл послать его на... небо за звёздочками, с соответствующей аргументацией на совете директоров. Подействовало.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выходит ошибка в запросе / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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