2

问题条件

我有一个非常简单的 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 Provider for Oracle 11g 的共享数据源:

Provider=OraOLEDB.Oracle.1;Data Source=LIFEDEV

(加上用户凭据)。

什么工作正常:

  • 存储过程在 PL/SQL Developer 中正确执行
  • SSRS 中的“测试连接”工作正常
  • 命令类型为“文本”的查询字符串SELECT * FROM MyTable;会在 SSRS 报告中生成正确的字段。
  • .NET Oracle 提供程序而不是 Oracle OLE DB 提供程序

什么失败:

如果我将命令类型更改为“存储过程”并输入“pr_myproc”,当我单击“确定”时,Visual Studio 2005(服务包 2)只会挂起/崩溃。

有没有人有这方面的知识/经验?

非常感激任何的帮助。谢谢。

更多信息

我已将提供程序从 Oracle OLE DB 提供程序修改为 .NET Oracle 提供程序,并且神奇地工作。

这似乎表明 Oracle 提供程序存在问题。

还有什么想法吗?

4

1 回答 1

1

我们深究了这一点。

在过程所在的环境中,我们有一个大量的数据字典。这两个提供者在查找信息时使用两个不同的查询。

这是 Oracle Provider 使用的,耗时 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

更多信息可以在这里找到

于 2010-11-03T12:54:20.250 回答