[英]Call oracle Stored Procedure with EF fail
我有一個oracle存儲過程,它在輸入參數中包含2個字符串和一個日期,並將ref光標作為輸出:
CREATE OR REPLACE PROCEDURE SCHEMA.MYPROSTO (
pPl IN VARCHAR2, -- Comma (;) separated
pTy IN VARCHAR2,-- Comma (;) separated
pDate IN mytable.mydate%TYPE,
pCursor OUT sys_refcursor)
IS
.....
sSQL VARCHAR2 (3000);
BEGIN
-- making SQL Order
sSQL := 'SELECT TO_CHAR (v.date_c........
......
OPEN pCursor FOR sSQL;
END MYPROSTO;
輸出游標返回一組3個字符串單元格行。
我在我的實體框架模型中導入了這個存儲過程,在.config文件中:
<oracle.manageddataaccess.client>
<version number="*">
<implicitRefCursor>
<storedProcedure schema="SCHEMA" name="MYPROSTO">
<refCursor name="PCURSOR">
<bindInfo mode="Output"/>
<metadata columnOrdinal="0" columnName="YEAR" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
<metadata columnOrdinal="1" columnName="MONTH" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
<metadata columnOrdinal="2" columnName="COUNT" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/>
</refCursor>
</storedProcedure>
</implicitRefCursor>
</version>
</oracle.manageddataaccess.client>
函數import wizzard創建了一個結果對象並生成了一個訪問函數:
public virtual ObjectResult<MYPROSTO_Result> MYPROSTO (string pPL, string pTY, Nullable<System.DateTime> pDATE)
{
var pPLParameter = pPL!= null ?
new ObjectParameter("PPL", pPL) :
new ObjectParameter("PPL", typeof(string));
var pTYParameter = pTY!= null ?
new ObjectParameter("PTY", pTY) :
new ObjectParameter("PTY", typeof(string));
var pDATEParameter = pDATE.HasValue ?
new ObjectParameter("PDATE", pDATE) :
new ObjectParameter("PDATE", typeof(System.DateTime));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<MYPROSTO_Result>("MYPROSTO", pPLParameter, pTYParameter, pDATEParameter);
}
但是,對此函數的調用會在最后一行引發異常( System.Data.Entity.Core.EntityCommandExecutionException ):
ORA-06550: Ligne 1, colonne 8 : PLS-00306: wrong number or types of arguments in call to 'MYPROSTO'
ORA-06550: Ligne 1, colonne 8 : PL/SQL: Statement ignored
我不明白為什么會失敗
似乎有幾個問題:
返回參數怎么樣? 它被“映射”了嗎? 再檢查一遍
肯定在錯誤消息中明確答案:
“調用'MYPROSTO'時參數的數量或類型錯誤”
您的過程需要4個參數,但您只需要傳遞3.您需要一個refcursor的輸出變量。
我有同樣的事情發生在我身上,最終解決了它。 我和你一樣使用oracle.manageddataaccess.client,並將我的.NET解決方案分為Presentation Project,WebAPI Project和Data Access Project。 我在數據訪問項目中的app.config具有正確的ImplicitRefCursor部分,其中包含光標定義和元數據,但我忘了將其復制到我的WebAPI項目的web.config中。 一旦我這樣做,我的“錯誤數量或類型的參數”錯誤就消失了。 希望有所幫助。 (我剛剛復制了整個oracle.manageddataaccess.client部分。)
此外,如果您手動生成整個ImplicitRefCursor部分,我發現了一種更簡單可靠的方法。 從.NET Server Explorer,連接到您的數據庫,找到您的存儲過程,右鍵單擊它並運行。 那好吧 它將顯示IN和OUT參數列表,包括光標。 如果單擊“顯示配置”按鈕,它將顯示您的EF app.config中需要的內容。 AddConfig按鈕將為您添加它。 這有助於避免錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.