Forum Webscript.Ru

Программирование => Perl => Тема начата: РИК от 23 Сентября 2005, 19:40:14

Название: Запрос Oracle некорректно выполняется
Отправлено: РИК от 23 Сентября 2005, 19:40:14
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.
Запрос отличается от других только своими большими размерами (около 3,5 килобайт). Остальные запросы выполняются корректно, без проблем. Этот же запрос выполняется из-под sqlplus нормально.
Смотрю на происходящее через SQLMonitor и ничего во время исполнения не происходит (во время выполнения этого запроса из-под любой другой оболочки, sqlplus или Toad, видно, что запрос к базе идет, параметры передаются).
Может быть какие-то ограничения на размер текста запроса где-то есть? Кто сталкивался с подобным, хелп! Плиз!
Название: Запрос Oracle некорректно выполняется
Отправлено: Green Kakadu от 23 Сентября 2005, 22:43:31
Цитировать
РИК:
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.

а ошибки какие-нибудь выводит?
может для таких сложных случаев стоит использовать хранимую процедуру?
Название: Запрос Oracle некорректно выполняется
Отправлено: РИК от 24 Сентября 2005, 07:47:49
Нет, ошибок никаких нет. Вообще ничего не происходит. Видно, что prepare проходит нормально, т.к. в случае, если в запросе ошибка в синтаксисе - prepare выдает оракловую ошибку, и в SQLMonitor виден ошибочный запрос. Когда же запрос работающий - prepare, затем - execute и все. Просто висит, пока perl из списка задач не удалишь (операционка WinXP).
Я конечно поизвращаюсь, что нибудь сделаю. Попробую еще под юниксом (программа в результате должна там работать), может и хранимую процедуру использую, но ситуация ненормальная. Нарушает веру в Perl :-). Не хотелось бы себе в чем то отказывать, должно ведь работать! Может глюк клиента Oracle... х.з. Будем искать.
Название: Запрос Oracle некорректно выполняется
Отправлено: Ivan Kolesnikov от 26 Сентября 2005, 13:22:57
А можно привести сам запрос.
Я выполнял запрос insert в таблицу, в общем в ней 2 поля: одно на 3000 символов, другое на 1000. Общая длина запроса 4086.
Все добавилось без проблем.
Связка Perl ActiveState + Oracle client 9.2
Название: Запрос Oracle некорректно выполняется
Отправлено: РИК от 26 Сентября 2005, 14:03:45
Вобщем, похоже решил я проблему.

Думаю, что проблема была в том, что в запросе куча вложенных селектов и еще какие-то особенности Оракла.

Я подключался только к DBI, для обычного запроса этого было достаточно (причем попробовал под юниксом, там все работает с одним DBI). Но для винды похоже этого мало, не знаю почему. Я включил DBD::Oracle и случилось чудо: все заработало!

Запрос, ради интереса:

select
      substr(:FirstDayOfMonth,5,2)||\'.\'||substr(:FirstDayOfMonth,1,4) Month,
      MasterCardIssue.or_der Branch,
      MasterCardIssue MasterCard,
      nvl(VisaIssue,0) Visa from
(
select or_der, count(*) MasterCardIssue
from
    (
     select c.ncst,
           case                                                                                  
             when trim(substr(tadd4add,1,3))=\'33\' then \'VIP\'                                  
             when substr(num_otdel,1,2)>0 then \'Filial \'||substr(num_otdel,1,2)                
             when substr(num_otdel,4,2)>1 then \'DO \'||substr(num_otdel,4,2)                    
             else \'Other\'                                                          
           end or_der
     from gcard c
          ,V_FORPOST_CARD_INFO v
          ,gaddress a
          ,grchadd ch
     where
         c.ncrd in
             (
             select ncrd from gcard
             where
                 dopencrd>=to_date(:FirstDayOfMonth,\'yyyymmdd\') and dopencrd                 and nbin in
                     (select nbin from gbin where nnet=1 and bin_description<>\'Administrative\')
                         )
         and c.ncrd=v.ncrd(+)
         and c.ncst=ch.ncst
         and a.nadd=ch.NADD
    )
      group by
            or_der
      order by
            or_der  
) MasterCardIssue,
(
select or_der, count(*) VisaIssue
from
(
select replace(replace(replace(replace(replace(replace(replace(TNAMECST,\'IY\',\'Y\'),\'IJ\',\'J\'),\'J\',\'Y\'),\'Y\',\'I\'),\'KH\',\'H\'),\'KS\',\'X\'),\'\'\'\',\'\') TNAMECST,
       replace(replace(replace(replace(replace(replace(replace(TFNAMCST,\'IY\',\'Y\'),\'IJ\',\'J\'),\'J\',\'Y\'),\'Y\',\'I\'),\'KH\',\'H\'),\'KS\',\'X\'),\'\'\'\',\'\') TFNAMCST,
       or_der
from gpcstmer cst,
     (
     select c.ncst,
           case                                                                                  
             when trim(substr(tadd4add,1,3))=\'33\' then \'VIP\'                                  
             when substr(num_otdel,1,2)>0 then \'Filial \'||substr(num_otdel,1,2)                
             when substr(num_otdel,4,2)>1 then \'DO \'||substr(num_otdel,4,2)                    
             else \'Other\'                                                          
           end or_der
     from gcard c
          ,V_FORPOST_CARD_INFO v
          ,gaddress a
          ,grchadd ch
     where
         c.ncrd in
             (
             select ncrd from gcard
             where
                 dopencrd>=to_date(:FirstDayOfMonth,\'yyyymmdd\') and dopencrd                 and nbin in
                     (select nbin from gbin where nnet=1 and bin_description<>\'Administrative\')
                         )
         and c.ncrd=v.ncrd(+)
         and c.ncst=ch.ncst
         and a.nadd=ch.NADD
     ) c1
where
     c1.ncst=cst.ncst
) s1,
(
select replace(replace(replace(replace(replace(replace(replace(TNAMECST,\'IY\',\'Y\'),\'IJ\',\'J\'),\'J\',\'Y\'),\'Y\',\'I\'),\'KH\',\'H\'),\'KS\',\'X\'),\'\'\'\',\'\') TNAMECST,
       replace(replace(replace(replace(replace(replace(replace(TFNAMCST,\'IY\',\'Y\'),\'IJ\',\'J\'),\'J\',\'Y\'),\'Y\',\'I\'),\'KH\',\'H\'),\'KS\',\'X\'),\'\'\'\',\'\') TFNAMCST
from gpcstmer
where
     ncst in
     (
     select ncst
     from gcard
     where
         dopencrd >= to_date(:FirstDayOfMonth,\'yyyymmdd\')
         and NBIN in
             (
             select nbin from gbin where nnet=2 and lower(bin_description) like \'%electron%\'
             )
     )
) s2
where
     upper(s1.tfnamcst)=upper(s2.tfnamcst)
     and upper(s1.tnamecst)=upper(s2.tnamecst)
group by
      s1.or_der  
order by
      s1.or_der  
) VisaIssue
where
 MasterCardIssue.or_der=VisaIssue.or_der(+)
order by
 MasterCardIssue.or_der