Oracle с пунктом, вызывающим проблему в SSRS? - PullRequest
4 голосов
/ 14 марта 2012

Я использую SSRS (2k5) для сообщения о данных от оракула. Цель отчета - обработать около 100 проверок (после завершения) данных, чтобы определить, правильно ли они были введены (и наше программное обеспечение работает так, как и должно). Для этого я создал пакет и конвейерную функцию, реализующую предложение WITH. Примерно пакет, встроенный в Oracle, выглядит так:

WITH A as (select stuff from X), B as (select stuff from Y join X), C as (select stuff from Z join X)
Subquery1
Union
Subquery2
Union
...
Subquery100 1010 *
*

Я вызываю эту функцию пакета напрямую из SSRS с помощью Table (). Некоторое время все работает отлично. Однако, если я запускаю его позже в тот же день, я получаю сообщение об ошибке:

ORA-32036: неподдерживаемый регистр для встраивания имени запроса в предложение WITH ORA-6512: в "[имя функции]"

Однако, если я открою Oracle SQLDeveloper и запусту функцию, а затем вернусь к SSRS, все будет работать нормально (какое-то время).

Я понимаю, что это, вероятно, злится на мои вложенные предложения WITH, но что может заставить его работать некоторое время, а затем вскоре потерпит неудачу? Обратите внимание, что он всегда работает в SQLDeveloper.

Заранее благодарим за помощь!

Ответы [ 5 ]

4 голосов
/ 19 марта 2012

Ваша проблема в том, что версия клиента (или, возможно, драйвера внутри вашего клиента), с которым вы подключаетесь к Oracle (внутри SSRS), вероятно, не поддерживает вызовы функций в предложении WITH.

В клиенте 9i предложение WITH не было полностью функциональным, и я подозреваю, что клиент, подключающийся к Oracle (даже если это не клиент 9i), все еще не полностью функционирует.

ВыВам придется либо:

1) обновить клиент (или драйвер) Oracle в рамках SSRS (если это возможно)2) Обновите свою версию SSRS (если она не самая последняя, ​​но проверьте, стоит ли сначала выполнить обновление)3) Перепишите свой запрос без предложений WITH и используйте вместо него встроенные представления.

Другой вариант - создать представления БД для необходимых данных и ссылаться на них в операторе выбора, не идеальный, но, возможно,option.

Надеюсь, это поможет ...

3 голосов
/ 19 ноября 2012

У меня была та же проблема, и я решил ее, добавив pragma autonomous_transaction; к функции ... например:

create or replace function myfunction()  return varchar2 is pragma autonomous_transaction;
begin
--Your code here
commit;---> don't forget the commit or else won't work
return 'result'
end; 

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

1 голос
/ 21 марта 2012

Возможно, Джефф подразумевал это раньше, однако я заставил это сработать, сдерживая запрос оракула с помощью OPENQUERY().
Любопытно, что мне все равно придется выполнить запрос один раз после всех изменений, чтобы он заработал, но Мне больше не нужно запускать его, прежде чем мне нужно запустить отчет. Еще раз спасибо за вашу помощь!

0 голосов
/ 12 мая 2016

В SSRS я подключен напрямую к своей базе данных Oracle 10g с помощью драйвера Oracle.Я обнаружил, что этот драйвер имеет следующие ограничения:

  1. На один подзапрос WITH нельзя ссылаться более одного раза в запросе, даже если SQL Developer позволяет вам "обмануть" и получитьпокончим с этим.

  2. Я получу ошибку ORA-32036, если я попытаюсь выполнить запрос в SSRS с более чем двумя WITH подзапросами, т.е. WITH A AS (...), B AS (...) SELECT ... FROM A, B ..., хотя в SQL Developer я могу использовать столько WITH, сколько мне нужно.

Поэтому еще одно предложение - попытаться переписать ваш запрос, чтобы использовать не более двух WITH подзапросы.

0 голосов
/ 05 февраля 2015

Я использовал другой инструмент BI, но получил ту же ошибку.Нашел хорошее решение, которое сработало для меня, добавив DistribTx = 0 в строку подключения.Кредит идет к Шону, прокомментировавшему это сообщение https://orastory.wordpress.com/2007/09/20/one-of-those-weird-ones-ora-32036/#comment-9164

Проблема по-прежнему не устранена Oracle по состоянию на 11g r2

...