簡體   English   中英

使用EF失敗調用oracle存儲過程

[英]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

我不明白為什么會失敗

似乎有幾個問題:

  • 將varchar(2)發送到日期字段
  • 參數“pTY”與“pType”的名稱
  • 參數“pPL”與“pPlant”的名稱
  • 參數“PPLT”與“PPL”的名稱

返回參數怎么樣? 它被“映射”了嗎? 再檢查一遍

肯定在錯誤消息中明確答案:

“調用'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM