【问题标题】:How to pass a TABLE OBJECT out parameter from C# ASP.NET Core to Oracle Stored Procedure如何将 TABLE OBJECT out 参数从 C# ASP.NET Core 传递到 Oracle 存储过程
【发布时间】:2019-10-04 07:05:09
【问题描述】:

我正在尝试将 Oracle 表对象输出参数从 ASP.NET Core 2.2 上的 C# API 传递到 Oracle 存储过程。

我有一个名为 GET_CARD_LIST 的 Oracle 存储过程

CREATE OR REPLACE TYPE TABLE_OBJECT IS TABLE OF VARCHAR2(16)

PROCEDURE GET_CARD_LIST(USER_ID IN number , CARD_LIST OUT TABLE_OBJECT) AS

BEGIN
    -- No real code, just an example query result
    SELECT CARD_NUMBER INTO CARD_LIST FROM CUSTOM_CARDS;
END GET_CARD_LIST;

这是我的C#代码,如何传递一个out参数来匹配存储过程中的out参数?

OracleConnection connection = _oracleDbContext.GetConnection();

using (OracleCommand command = new OracleCommand())
{
    command.Connection = connection;                
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "PRUN_APP_SV_PKG.OBTIENE_ID_TH_P";
    command.Parameters.Add("EMAIL", OracleDbType.Varchar2, ParameterDirection.Input).Value = email;

    // Here is my problem, how pass out parameter?            
    command.Parameters.Add("CARD_LIST", OracleDbType.???, ParameterDirection.Output);                

    try
    {
        command.ExecuteNonQuery();
    }
    catch (System.Exception ex)
    {
        _logger.LogCritical("Oracle - ExecuteNonQuery. Exception: {ex}", ex);
    }
    finally
    {                        
        command.Dispose();
        if (connection.State == ConnectionState.Open)
            connection.Close();
    }
}

非常感谢您!

【问题讨论】:

    标签: c# oracle asp.net-core


    【解决方案1】:

    返回游标而不是嵌套表。

    CREATE OR REPLACE FUNCTION GET_CARD_LIST(USER_ID IN number) RETURN SYS_REFCURSOR AS
       CARD_LIST SYS_REFCURSOR;
    BEGIN
        OPEN CARD_LIST AS
        SELECT CARD_NUMBER FROM CUSTOM_CARDS;
    
        RETURN CARD_LIST;
    END GET_CARD_LIST;
    

    抱歉,如果一个过程只有一个返回值,那么我更喜欢 FUNCTION 而不是 PROCEDURE。

    如果您必须在代码中使用现有结构,那么它会是

    CREATE OR REPLACE FUNCTION GET_CARD_LIST(USER_ID IN number) RETURN SYS_REFCURSOR AS
       CARD_LIST TABLE_OBJECT;
       res SYS_REFCURSOR;
    BEGIN
        SELECT CARD_NUMBER BULK COLLECT INTO CARD_LIST FROM CUSTOM_CARDS;
    
        OPEN res FOR
        SELECT * FROM TABLE(CARD_LIST);    
        RETURN res;
    END GET_CARD_LIST;
    

    在 C# 中,参数是

    command.Parameters.Add("res", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
    

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2020-03-05
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多