Автор Тема: Запрос Oracle некорректно выполняется  (Прочитано 4242 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн РИК

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Запрос Oracle некорректно выполняется
« : 23 Сентября 2005, 19:40:14 »
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.
Запрос отличается от других только своими большими размерами (около 3,5 килобайт). Остальные запросы выполняются корректно, без проблем. Этот же запрос выполняется из-под sqlplus нормально.
Смотрю на происходящее через SQLMonitor и ничего во время исполнения не происходит (во время выполнения этого запроса из-под любой другой оболочки, sqlplus или Toad, видно, что запрос к базе идет, параметры передаются).
Может быть какие-то ограничения на размер текста запроса где-то есть? Кто сталкивался с подобным, хелп! Плиз!

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Запрос Oracle некорректно выполняется
« Ответ #1 : 23 Сентября 2005, 22:43:31 »
Цитировать
РИК:
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.

а ошибки какие-нибудь выводит?
может для таких сложных случаев стоит использовать хранимую процедуру?
 в исканиях.

Оффлайн РИК

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Запрос Oracle некорректно выполняется
« Ответ #2 : 24 Сентября 2005, 07:47:49 »
Нет, ошибок никаких нет. Вообще ничего не происходит. Видно, что prepare проходит нормально, т.к. в случае, если в запросе ошибка в синтаксисе - prepare выдает оракловую ошибку, и в SQLMonitor виден ошибочный запрос. Когда же запрос работающий - prepare, затем - execute и все. Просто висит, пока perl из списка задач не удалишь (операционка WinXP).
Я конечно поизвращаюсь, что нибудь сделаю. Попробую еще под юниксом (программа в результате должна там работать), может и хранимую процедуру использую, но ситуация ненормальная. Нарушает веру в Perl :-). Не хотелось бы себе в чем то отказывать, должно ведь работать! Может глюк клиента Oracle... х.з. Будем искать.

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Запрос Oracle некорректно выполняется
« Ответ #3 : 26 Сентября 2005, 13:22:57 »
А можно привести сам запрос.
Я выполнял запрос insert в таблицу, в общем в ней 2 поля: одно на 3000 символов, другое на 1000. Общая длина запроса 4086.
Все добавилось без проблем.
Связка Perl ActiveState + Oracle client 9.2

Оффлайн РИК

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 4
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Запрос Oracle некорректно выполняется
« Ответ #4 : 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

 

Sitemap 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