Страница 1 из 1
Параметрические вложенные запросы
Добавлено: 28 июл 2014, 18:16
Андрей Сакольчик
Здравствуйте.
При выполнении запроса (источник данных) в приведенном виде возникает исключение без текста (скриншот приаттачен). Если закомментить строки с параметрическими условиями (between ?0 and (?1 + TO_DSINTERVAL('0 23:59:59')), то результат возвращается. Если оставить только один вложенный запрос, то тоже все работает даже с параметрами. Проверял весь запрос в TOAD, предварительно заменив параметры на даты, - тоже все ок. Всю голову сломал. Имеется какое-то ограничение SS или моя врожденная криворукость?
Среда: клиент на W2k8SRV с instantclient Oracle 12.01.0001, SS.Net v.2014.1.1900 from 10/04/2014, БД - Oracle 11.2
Код: Выделить всё
select * from
(select TO_CHAR(cl_tm,'yyyy-mm') as per1
,SUM (SD_SD) AS by_SD,SUM (ALL_SD) AS by_ALL
,ROUND (SUM(SD_SD) / SUM (ALL_SD) * 100, 2) AS perc
from BAPB_SD_WITHOUT_ESCAL_NO_GROUP
where cl_tm between ?0 and (?1 + TO_DSINTERVAL('0 23:59:59'))
group by TO_CHAR(cl_tm,'yyyy-mm')) cl,
(SELECT
TO_CHAR (i.close_time, 'yyyy-mm') AS per2
,COUNT (*) AS num_SD
,Round (AVG(i.HPE_GRADE),2) AS avg_grade
FROM SABELAGRO.incidentsm1 i
WHERE i.closed_by LIKE 'CC_%'
and i.close_time between ?0 and (?1 + TO_DSINTERVAL('0 23:59:59'))
group by TO_CHAR (i.close_time, 'yyyy-mm')) sev
where cl.per1 = sev.per2
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 11:03
Aleksey
Здравствуйте,
Пожалуйста, попробуйте использовать не нумерованные параметры.
...
where cl_tm between ? and (? + TO_DSINTERVAL('0 23:59:59'))
...
Если это не поможет, то пришлите, пожалуйста, ваш отчет для анализа.
Спасибо.
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 14:40
Андрей Сакольчик
Попробовал, результат тот же. Высылаю отчет.
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 15:19
Aleksey
Здравствуйте,
Не смогли воспроизвести проблему на наших данных. Попробуйте, убрать в своем запросе все лишнее, к примеру закомментированные куски запроса.
Спасибо.
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 16:00
Андрей Сакольчик
Здравствуйте.
Ваш пример и не должен воспроизвести мою проблему. В первом посте я писал, что вложенные запросы
по одному отрабатывают с параметрами также, как и на вашем скрине без проблем. Трабла начинается при попытке запустить в комплексе запрос, базирующийся на двух. Попробуйте на своей среде выполнить вот этот код.
Код: Выделить всё
select * from
(to_char(hiredate,'yyyy-mm') as per1
,sum(comm) as tot
,count(*) as cnt
from scott.emp
where hiredate between ? and (? + TO_DSINTERVAL('0 23:59:59'))
group by to_char(hiredate,'yyyy-mm')) q1,
(to_char(hiredate,'yyyy-mm') as per2
,sum(comm) as tot
,count(*) as cnt
from scott.emp
where hiredate between ? and (? + TO_DSINTERVAL('0 23:59:59'))
group by to_char(hiredate,'yyyy-mm')) q2
where q1.per1=q2.per2
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 16:03
Леонид
Очень часто запросы не работают из разных сред выполнения, хотя казалось бы, что это всё тот же парсер Oracle (на сервере), но увы.
Согласен с Алексеем, очень важный момент - наличие комментариев. Иногда их присутствие выдаёт очень и очень странные ошибки, при этом в Toad'е всё будет работать идеально. Это первый момент.
Второй момент. Если есть возможность, "заверните" весь этот запрос в StoredProcedure и вызывайте прямо в отчёте, например так:
Код: Выделить всё
SELECT *
FROM TABLE(documents_reports_pkg.rep_voucher(:DOC_CODE))
Работать будет 100%, и не будете ломать голову.
P.S. Так же возился очень долго с подобной проблемой, только из кода C#, один раз, оказалось дело было всего лишь в комментариях (двух символах "--" - убрал их), другой раз, в строгом привидении поля к типу NUMBER(15,2), когда в case OracleClient для C# не понимал, что возвращать: (when PREV_TOTAL_SUM = 0 and PLAN_AMOUNT < 0 then -100 else 0 end) as NUMBER(15,0)) as PERCENT_COMPARE_PLAN) .
То есть, это не ваша "криворукость", это криворукость соответствующего парсера - в любом случае. Так как, в противном случае, из этого текстового поля парсер должен просто "отдавать" эту строку парсеру на сервере и не заниматься "самодеятельностью".
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 16:45
Aleksey
Здравствуйте,
Андрей Сакольчик писал(а):Здравствуйте.
Ваш пример и не должен воспроизвести мою проблему. В первом посте я писал, что вложенные запросы по одному отрабатывают с параметрами также, как и на вашем скрине без проблем. Трабла начинается при попытке запустить в комплексе запрос, базирующийся на двух. Попробуйте на своей среде выполнить вот этот код.
Код: Выделить всё
select * from
(to_char(hiredate,'yyyy-mm') as per1
,sum(comm) as tot
,count(*) as cnt
from scott.emp
where hiredate between ? and (? + TO_DSINTERVAL('0 23:59:59'))
group by to_char(hiredate,'yyyy-mm')) q1,
(to_char(hiredate,'yyyy-mm') as per2
,sum(comm) as tot
,count(*) as cnt
from scott.emp
where hiredate between ? and (? + TO_DSINTERVAL('0 23:59:59'))
group by to_char(hiredate,'yyyy-mm')) q2
where q1.per1=q2.per2
Данный запрос вызывает ошибку, даже с подстановкой значений вместо параметров. Пожалуйста, проверьте его.
Так же проверили простой запрос с несколькими вложенностями. Так же не возникло проблем.
Re: Параметрические вложенные запросы
Добавлено: 29 июл 2014, 17:35
Андрей Сакольчик
Вы пытаетесь предложенный запрос запустить на MS SQL? Он такие запросы не переваривает.
Леонид, благодарю за дельный коммент. Буду пробовать через хранимку.
Re: Параметрические вложенные запросы
Добавлено: 30 июл 2014, 10:07
Aleksey
Здравствуйте.
Нет, данные запросы проверялись на Oracle.
Спасибо.