2013-02-19 4 views
6

Oracle 11gからEntity Frameworkへのストアド・プロシージャにアクセスしようとしています。私はスカラーを返すストアドプロシージャにアクセスすることができ、それらは正しい値を返します。しかし、結果セットを返すためにSYS_REFCURSORを使用すると、関数インポートでOUTパラメータが検出されないエンティティ・フレームワークのカンサ・マップSYS_REFCURSOR

私のストアドプロシージャは

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パラメータは、結果セットを取得するために、インポート機能では検出されません。

This is the image of imported function

私は同様の問題を抱えていた私は、ストアドプロシージャ

+0

ストアドプロシージャを「インポート」するプロセスは何ですか? –

+1

@TomHalladayストアドプロシージャは、Entity Frameworkから呼び出すことができるように関数としてインポートする必要があります。 –

答えて

3

今すぐOracleデータプロバイダは、ここで答えることがあまりにも精巧多くのhustle.Itsせずに操作のこの種のことができます。ここ

は、参考のために完全な記事です。クイックリードが追加されました。詳細は以下のリンクをご覧ください。

ODP.NET 11gリリース2(11.2.0.3.0)、及びより高い、.NETコードでこれらのパラメータに結合明示 を使用せずREFカーソルパラメータを持つストアドプロシージャを実行するアプリケーション を可能にします。

OracleDataReaderを使用するREF CURSORなどの読取り専用結果セットの場合、REF CURSORスキーマ情報は自動的に で取得されます。更新のREF CURSORまたはエンティティ フレームワークを使用する場合、いくつかのシナリオについて

など、開発者は、アプリケーションが暗黙のREF CURSORを結合することができるように、REFカーソルスキーマ 情報を定義する必要があります。 Entity Frameworkアプリケーションは、 への暗黙のREF CURSORバインディングを使用して、REF CURSORデータから複雑な型をインスタンス化します。アプリケーションは で、app.config、 web.config、またはmachine.config .NET構成ファイルでREF CURSORバインドおよびメタデータ情報を指定する必要があります。

.NET構成ファイルで指定されている属性は、アプリケーションがREF CURSORを表す OracleDataReaderオブジェクトからスキーマ情報を要求する場合にも使用されます。 つまり、単一の表からSELECTを使用して作成されたREF CURSORの場合は 、 の場合は、アプリケーションは OracleDataAdapterおよびOracleCommandBuilderを使用してその表を更新できます。

Entity Frameworkを使用している場合、関数のインポートでは、 暗黙的にバインドされたREF CURSORが返されます。 REF CURSORは、複合型またはエンティティタイプの コレクションとして返すことができます。複合型 コレクションを返すには、.NET構成ファイルでREF CURSOR バインド情報とメタデータ情報を定義する必要があります。エンティティタイプコレクションを返すには、 バインド情報のみを.NETの 構成ファイルで定義する必要があります。

あなたが次の操作を行う必要があるEFとインポート機能を使用するには、完全な情報にhere

2

によって取得された結果セットにアクセスすることはできませんthis.Withoutは、パラメータをOUT得ることに私を助けてください。

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

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

+0

こんにちは - それではどうやってEFからSPに電話しますか?このように:var result = db.Database.SqlQuery ( "call OWI_ADMIN.S_LANDEN()"); ?? –

2

複雑な戻り値の型とバイナリフィールドを持つストアドプロシージャと関数を実行する場合、EntityフレームワークでのOracleのやり方はあまり良い方法ではないと思います。

+3

ありがとうございます。質問者をさらに助けるためには、悪い練習であることについてだけでなく、建設的な道筋についてもコメントすることが役立つでしょう。この場合、どのような良い方法や良い方法がありますか? – Bex

3

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

例:

<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など。アングルブラケットも取り外してください。 XMLエントリにhttp://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

ドキュメント:http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

+0

メタファイルを使用してConfigファイルを手動で作成する必要はなくなりました。 「ストアドプロシージャの実行」ウィザードがそれを行います。 「記事」のリンクは非常に古くなっています。これを代わりに使用してくださいhttps://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812::::: 244PON_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24このページの他の場所で私の答えを見てください。 –

3

を探す:最初OUT SYS_REFCURSORは、あなたのパラメータリストに遭遇)

1のエンティティの出力となります関数。したがって、あなたのSPまたは機能を、このOUT SYS_REFCURSORを含む新しい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

を、Visual StudioのオンラインヘルプのためのOracle Developer ToolsのEntity Frameworkのセクションを参照してください。

関連する問題