Forum Webscript.Ru
Программирование => Perl => Тема начата: РИК от 23 Сентября 2005, 19:40:14
-
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.
Запрос отличается от других только своими большими размерами (около 3,5 килобайт). Остальные запросы выполняются корректно, без проблем. Этот же запрос выполняется из-под sqlplus нормально.
Смотрю на происходящее через SQLMonitor и ничего во время исполнения не происходит (во время выполнения этого запроса из-под любой другой оболочки, sqlplus или Toad, видно, что запрос к базе идет, параметры передаются).
Может быть какие-то ограничения на размер текста запроса где-то есть? Кто сталкивался с подобным, хелп! Плиз!
-
РИК:
Проблема в следующем: выполняю запрос к Oracle из-под Perl\'a, но во время выполнения execute не происходит вообще ничего.
а ошибки какие-нибудь выводит?
может для таких сложных случаев стоит использовать хранимую процедуру?
-
Нет, ошибок никаких нет. Вообще ничего не происходит. Видно, что prepare проходит нормально, т.к. в случае, если в запросе ошибка в синтаксисе - prepare выдает оракловую ошибку, и в SQLMonitor виден ошибочный запрос. Когда же запрос работающий - prepare, затем - execute и все. Просто висит, пока perl из списка задач не удалишь (операционка WinXP).
Я конечно поизвращаюсь, что нибудь сделаю. Попробую еще под юниксом (программа в результате должна там работать), может и хранимую процедуру использую, но ситуация ненормальная. Нарушает веру в Perl :-). Не хотелось бы себе в чем то отказывать, должно ведь работать! Может глюк клиента Oracle... х.з. Будем искать.
-
А можно привести сам запрос.
Я выполнял запрос insert в таблицу, в общем в ней 2 поля: одно на 3000 символов, другое на 1000. Общая длина запроса 4086.
Все добавилось без проблем.
Связка Perl ActiveState + Oracle client 9.2
-
Вобщем, похоже решил я проблему.
Думаю, что проблема была в том, что в запросе куча вложенных селектов и еще какие-то особенности Оракла.
Я подключался только к 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