7

Entity Framework を介して Oracle 11g のストアド プロシージャにアクセスしようとしています。スカラーを返すストアド プロシージャにアクセスでき、それらは正しい値を返します。ただし、結果セットを返すために SYS_REFCURSOR を使用する場合、 OUT パラメータは関数 import で検出されません

私のストアドプロシージャは以下の通りです

create or replace PROCEDURE "GetAllClientNames" (
  "ID" IN NUMBER, 
  "SAL" IN NUMBER, 
  "EMP_CURSOR" OUT SYS_REFCURSOR) IS

BEGIN 


    OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS;

END;

ただし、エンティティを更新して関数のインポートを実行すると、インポートされた関数で SYS_REFCURSOR OUT パラメータが検出されず、結果セットが取得されません。

これはインポートされた関数のイメージです

これについて私を助けてください.OUTパラメータを取得しないと、ストアドプロシージャによって取得された結果セットにアクセスできません

4

5 に答える 5

4

Entity Framework を使用して、Oracle ストアド プロシージャから ref カーソルなどの複合型を返すことができます。少し追加の設定が必要です。返される refcursor と列のデータ型を識別するために、構成ファイルに適切な XML を追加する必要があります。

例:

<oracle.dataaccess.client>
<settings>
  <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo='mode=Output'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata='ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32'" />
</settings>
</oracle.dataaccess.client>

schema.storedprocの値を自分のものに置き換えるだけです。ACCOUNTING.GET_EMPLOYEES など。column_name_hereを自分の列に置き換えます。EMP_ID など。アングル ブラケットも取り外します。

参照用の完全な記事は次のとおりです 。 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

XML エントリに関するドキュメント: http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

于 2013-10-30T15:30:16.813 に答える
3

EF でインポート関数を使用するには、次の手順を実行する必要があります。

1) パラメータ リストで最初に検出された OUT SYS_REFCURSOR がエンティティ関数の出力になります。したがって、この OUT SYS_REFCURSOR を含む新しい SP で SP または関数をラップする必要がある場合があります。

2) app.config または web.config 内で、このカーソルに関するメタデータを設定する必要があります。これは、サーバー エクスプローラーの [ストアド プロシージャの実行] ダイアログによって自動化されます。

これについての段階的なウォークスルーをここで見ることができます: https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24

この件に関する詳細なドキュメントは、Oracle Developer Tools for Visual Studioオンライン・ヘルプのエンティティ・フレームワークのセクションを参照してください。

于 2014-10-23T19:24:28.177 に答える
2

同様の問題がありました。

長い調査の結果、エンティティ フレームワークに対する Oracle のサポートは、ストアド プロシージャからの戻り値の型として複雑なデータ型を使用するためにまだ進化していないことがわかりました。それは可能です。しかし、それは頭の周りで鼻に触れるようなものです。したがって、簡単に EF を使用している場合は、それを避けて、ストアド プロシージャを直接使用することをお勧めします。

最後に、作成、更新、および削除 (監査証跡を実装する必要があるため) には EF を使用し、結果セットを返すストアド プロシージャを使用することにしました。

于 2013-08-21T09:43:00.473 に答える
2

複雑な戻り値の型とバイナリ フィールドを使用してストアド プロシージャと関数を実行する場合、エンティティ フレームワークをオラクルの方法で使用することはあまり良い方法ではないと思います。

于 2013-08-21T10:14:33.443 に答える