Страница 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.

Спасибо.