簡體   English   中英

Oracle存儲過程返回SYS_REFCURSOR和實體框架模型的問題

[英]Issue with Oracle stored procedure returning SYS_REFCURSOR and Entity Framework Model

我有一個Oracle數據庫(帶有12.1個客戶端位的11.2服務器端),其中載有返回SYS_REFCURSOR對象類型的存儲過程。

我試圖通過Visual Studio 2017(15.6.3)和Oracle Managed DataAccess客戶端(12.1)中的Add new ADO.NET Entity Data Model向導導入這套過程。 但是,當我訪問這些存儲過程時,出現如下異常: PLS-00306: wrong number or types of arguments in call to 'my_procedure'

這種Oracle存儲過程的示例如下所示:

create or replace PROCEDURE my_procedure (
       input               IN  VARCHAR2,
       cur_output OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN cur_output FOR
    SELECT    col1
    ,    col2
    ,    col3
    FROM my_table
    WHERE col1 = input;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
        WHEN OTHERS THEN    
            RAISE;
END my_procedure;

生成的模型xml如下所示:

<Function Name="my_procedure" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="myschema">
    <Parameter Name="input" Type="varchar2" Mode="In" />
</Function>

生成的C#代碼如下所示:

public virtual int my_procedure(string input) {
    var inputParameter = input != null ?
        new ObjectParameter("input", input) :
        new ObjectParameter("input", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("my_procedure", inputParameter);
}

我手動調用了Oracle DataAccess API,以下代碼起作用了:

OracleConnection conn = new OracleConnection(...);  
conn.Open();
using (OracleCommand cmd = new OracleCommand("my_procedure", conn)) {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("input", OracleDbType.Varchar2).Value = "myinput";                
    cmd.Parameters.Add("cur_output", OracleDbType.RefCursor, null, ParameterDirection.Output);
    var dr = cmd.ExecuteReader();
    dr.Read();
    var col1id = dr.GetOrdinal("col1");
    var valuecol1 = SafeGetString(dr, col1id);
}
conn.Dispose();

理想情況下,我希望有一個自動化過程來生成正確的C#代碼以訪問存儲過程。 解決此問題的最實用方法是什么?

您將存儲過程定義為my_procedure,它具有兩個參數,即input和cur_output。 在C#中調用此過程時,還應該傳遞一個參數FOR BOTH input和cur_output 過程不是返回值的函數。 過程將把輸出分配給您作為OUT參數分配的變量,在本例中將其命名為cur_output。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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