Выбор хранимой процедуры Oracle в SSRS завершает работу Visual Studio 2005 IDE
Условия проблемы
У меня есть очень простая Oracle (11g) хранимая процедура, которая объявлена так:
CREATE OR REPLACE PROCEDURE pr_myproc(L_CURSOR out SYS_REFCURSOR)
is
BEGIN
OPEN L_CURSOR FOR
SELECT * FROM MyTable;
END;
Это правильно компилируется. Курсор содержит col1, col2 и col3.
В SSRS у меня есть общий источник данных, который использует провайдера Oracle OLEDB для Oracle 11g:
Provider=OraOLEDB.Oracle.1;Data Source=LIFEDEV
(Плюс учетные данные пользователя).
Что работает хорошо:
- Хранимая процедура выполняется правильно в PL/SQL Developer
- "Тестовое соединение" работает нормально в SSRS
- Строка запроса
SELECT * FROM MyTable;
с типом команды 'text' создает правильные поля в отчете SSRS. - .NET Oracle Provider вместо Oracle OLEDB Provider
Что терпит неудачу:
Если я изменю тип команды на "Хранимая процедура" и ввожу "pr_myproc", при нажатии "ОК" Visual Studio 2005 (пакет обновления 2) просто зависает / падает.
Кто-нибудь имеет какие-либо знания / опыт в этом?
Любая помощь будет наиболее ценной. Благодарю.
ДАЛЬНЕЙШАЯ ИНФОРМАЦИЯ
Я изменил провайдера с провайдера Oracle OLE DB на провайдера.NET Oracle, и, как ни странно, он работает.
Это может указывать на проблему с поставщиком Oracle.
Есть еще мысли?
1 ответ
Мы дошли до сути этого.
В среде, где находилась процедура, у нас есть существенный словарь данных. Два провайдера при поиске информации используют два разных запроса.
Вот тот, который использовал поставщик Oracle, занимая более 10 минут:
select * from (select null PROCEDURE_CATALOG
, owner PROCEDURE_SCHEMA
, object_name PROCEDURE_NAME
, decode (object_type, 'PROCEDURE', 2, 'FUNCTION', 3, 1) PROCEDURE_TYPE
, null PROCEDURE_DEFINITION
, null DESCRIPTION
, created DATE_CREATED
, last_ddl_time DATE_MODIFIED
from all_objects where object_type in ('PROCEDURE','FUNCTION')
union all
select null PROCEDURE_CATALOG
, arg.owner PROCEDURE_SCHEMA
, arg.package_name||'.'||arg.object_name PROCEDURE_NAME
, decode(min(arg.position), 0, 3, 2) PROCEDURE_TYPE
, null PROCEDURE_DEFINITION
, decode(arg.overload, '', '', 'OVERLOAD') DESCRIPTION
, min(obj.created) DATE_CREATED
, max(obj.last_ddl_time) DATE_MODIFIED
from all_objects obj, all_arguments arg
where arg.package_name is not null
and arg.owner = obj.owner
and arg.object_id = obj.object_id
group by arg.owner, arg.package_name, arg.object_name, arg.overload ) PROCEDURES
WHERE PROCEDURE_NAME = '[MY_PROCEDURE_NAME]' order by 2, 3
Более подробную информацию можно найти здесь