2013-02-19 35 views
6

我試圖通過實體框架訪問Oracle 11g上的存儲過程。我可以訪問返回標量的存儲過程,並返回正確的值。但是,當使用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

請幫我在this.Without越來越OUT參數我無法訪問由存儲過程

+0

「導入」存儲過程的過程是什麼? – 2013-02-20 00:33:40

+1

@TomHalladay存儲過程必須作爲函數導入,以便可以從實體框架中調用它。 – 2013-02-23 05:48:40

回答

3

現在是Oracle數據提供商允許這種操作沒有太多hustle.Its太複雜在這裏回答。快速閱讀被添加。請按照以下鏈接獲取詳細信息。

ODP.NET 11g第2版(11.2.0.3.0),和更高的,使得應用 運行具有REF CURSOR參數的存儲過程,而不使用顯式 在.NET代碼這些參數的結合。

對於只讀結果集,例如使用 OracleDataReader的REF CURSOR,將自動檢索到REF CURSOR架構信息 。

對於某些情況下,如當使用可更新的REF光標或實體 框架,開發者需要定義REF CURSOR架構 信息,使得應用程序可以結合隱REF CURSOR。 實體框架應用程序使用隱式REF CURSOR綁定到 實例化來自REF CURSOR數據的複雜類型。應用程序必須 在app.config, web.config或machine.config .NET配置文件中指定REF CURSOR綁定和元數據信息。

當應用程序請求代表REF CURSOR的 OracleDataReader對象時,也使用.NET配置文件中提供的屬性 。這意味着對於使用來自單個表的SELECT創建的REF CURSOR, 應用程序可以通過使用 OracleDataAdapter和OracleCommandBuilder更新該表。

當使用實體框架時,函數導入可以返回一個隱式約束REF CURSOR 。 REF CURSOR可作爲 收集複雜類型或實體類型返回。要返回一個複雜類型的 集合,.NET配置文件需要定義REF CURSOR 綁定和元數據信息。要返回實體類型集合,僅需要在.NET 配置文件中定義綁定信息,即 。

找到完整的信息here

2

檢索到的結果集我有一個類似的問題。

經過長時間的研究後,我發現Oracle對實體框架的支持還沒有發展爲使用複雜的數據類型作爲存儲過程的返回類型。可以辦到;但它像鼻子周圍的鼻子。因此,如果您使用EF來緩解問題,那麼最好避免使用它,並直接使用存儲過程。

最後我決定用EF來創建,更新和刪除(因爲我必須實現審計跟蹤)和存儲過程以返回結果集。

+0

你好 - 那麼你怎樣從EF調用SP?像這樣:var result = db.Database.SqlQuery (「call OWI_ADMIN.S_LANDEN()」); ?? – 2013-08-26 10:13:51

2

如果你想用複雜的返回類型和二進制字段來執行存儲過程和函數,我不認爲用Entity框架進行oracle方式是一種很好的方法。

+3

謝謝你的回答。爲了進一步幫助提問者,不僅要評論什麼是不好的做法,還要評論什麼是建設性的前進方向。在這種情況下,什麼是好的或更好的方法? – Bex 2013-08-21 10:37:37

3

使用實體框架可以從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。也刪除角括號。

這裏是參考文章全文: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

+0

您不再需要手工創建帶有元數據的配置文件,也不會想要。 「運行存儲過程」嚮導可爲您提供幫助。 「文章」的鏈接已經過時了。使用這一個,而不是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請參閱我在本頁其他地方的回答。 – 2014-12-05 09:42:31

3

要使用與EF導入功能,你需要做到以下幾點:

1)第一OUT SYS_REFCURSOR在參數列表中遇到將成爲實體的輸出功能。因此,您可能需要用包含此OUT的新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開發工具Visual Studio在線幫助的實體框架部分。