Как передать параметр TABLE OBJECT из C # ASP.NET Core в хранимую процедуру Oracle - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь передать параметр табличного объекта Oracle из API C # в ASP.NET Core 2.2 в хранимую процедуру Oracle.

У меня есть хранимая процедура Oracle с именем GET_CARD_LIST

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();
    }
}

Заранее большое спасибо!

1 Ответ

0 голосов
/ 04 октября 2019

Возвращает курсор, а не вложенную таблицу.

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;

Извините, если процедура имеет только одно возвращаемое значение, я предпочитаю ФУНКЦИЮ, а не ПРОЦЕДУРУ.

Если у вас естьчтобы использовать существующие структуры в вашем коде, тогда это будет

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...