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には、Oracle11g用のOracleOLEDBプロバイダーを使用する共有データソースがあります。

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

(さらにユーザーの資格情報)。

何がうまくいくか:

  • ストアドプロシージャはPL/SQLDeveloperで正しく実行されます
  • の「テスト接続」はSSRSで正常に機能します
  • SELECT * FROM MyTable;コマンドタイプが「text」のクエリ文字列は、SSRSレポートに正しいフィールドを生成します。
  • OracleOLEDBプロバイダーではなく.NETOracleプロバイダー

失敗するもの:

コマンドタイプを「ストアドプロシージャ」に変更して「pr_myproc」と入力すると、「OK」をクリックすると、Visual Studio 2005(Service Pack 2)がハング/クラッシュします。

誰かがこれについての知識/経験を持っていますか?

どんな助けでも大歓迎です。ありがとう。

さらに詳しい情報

プロバイダーをOracleOLEDBプロバイダーから.NETOracleプロバイダーに変更しましたが、魔法のように機能します。

これは、Oracleプロバイダーに問題があることを示しているように思われます。

これ以上の考えはありますか?

4

1 に答える 1

1

私たちはこれの底に到達しました。

プロシージャが存在する環境には、実質的なデータディクショナリがあります。情報を検索するときの2つのプロバイダーは、2つの異なるクエリを使用します。

これは、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

詳細については、こちらをご覧ください

于 2010-11-03T12:54:20.250 に答える