Параметрические вложенные запросы

Обсуждение Stimulsoft Reports.NET
Ответить
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

Параметрические вложенные запросы

Сообщение Андрей Сакольчик »

Здравствуйте.
При выполнении запроса (источник данных) в приведенном виде возникает исключение без текста (скриншот приаттачен). Если закомментить строки с параметрическими условиями (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
Вложения
empty_except.JPG
empty_except.JPG (33.5 КБ) 3560 просмотров
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Параметрические вложенные запросы

Сообщение Aleksey »

Здравствуйте,

Пожалуйста, попробуйте использовать не нумерованные параметры.
...
where cl_tm between ? and (? + TO_DSINTERVAL('0 23:59:59'))
...

Если это не поможет, то пришлите, пожалуйста, ваш отчет для анализа.

Спасибо.
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

Re: Параметрические вложенные запросы

Сообщение Андрей Сакольчик »

Попробовал, результат тот же. Высылаю отчет.
Вложения
Rep_SD.mrt
В отчете смотрите источник с именем SD_complex
(97.89 КБ) 330 скачиваний
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Параметрические вложенные запросы

Сообщение Aleksey »

Здравствуйте,

Не смогли воспроизвести проблему на наших данных. Попробуйте, убрать в своем запросе все лишнее, к примеру закомментированные куски запроса.

Спасибо.
Вложения
Capture.PNG
Capture.PNG (75.35 КБ) 3549 просмотров
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

Re: Параметрические вложенные запросы

Сообщение Андрей Сакольчик »

Здравствуйте.
Ваш пример и не должен воспроизвести мою проблему. В первом посте я писал, что вложенные запросы по одному отрабатывают с параметрами также, как и на вашем скрине без проблем. Трабла начинается при попытке запустить в комплексе запрос, базирующийся на двух. Попробуйте на своей среде выполнить вот этот код.

Код: Выделить всё

  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
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Параметрические вложенные запросы

Сообщение Леонид »

Очень часто запросы не работают из разных сред выполнения, хотя казалось бы, что это всё тот же парсер 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) .
То есть, это не ваша "криворукость", это криворукость соответствующего парсера - в любом случае. Так как, в противном случае, из этого текстового поля парсер должен просто "отдавать" эту строку парсеру на сервере и не заниматься "самодеятельностью".
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Параметрические вложенные запросы

Сообщение 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
Данный запрос вызывает ошибку, даже с подстановкой значений вместо параметров. Пожалуйста, проверьте его.

Так же проверили простой запрос с несколькими вложенностями. Так же не возникло проблем.
Вложения
Capture.PNG
Capture.PNG (64.97 КБ) 3543 просмотра
Андрей Сакольчик
Сообщения: 7
Зарегистрирован: 14 май 2014, 14:53

Re: Параметрические вложенные запросы

Сообщение Андрей Сакольчик »

Вы пытаетесь предложенный запрос запустить на MS SQL? Он такие запросы не переваривает.

Леонид, благодарю за дельный коммент. Буду пробовать через хранимку.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Параметрические вложенные запросы

Сообщение Aleksey »

Здравствуйте.

Нет, данные запросы проверялись на Oracle.

Спасибо.
Ответить