Поставщик данных Oracle - вызовите ExecuteReader, чтобы получить параметры OUT

Я выполняю рефакторинг существующего приложения, чтобы изменить поставщика данных Oracle с OLE DB на управляемого поставщика данных Oracle (ODP).

Мне нужно вызвать следующую хранимую процедуру, которая имеет несколько входных параметров и несколько параметров OUT, которые в основном имеют тип TABLE из VARCHAR2

PROCEDURE RetrieveInfo(
p_vParam1               IN          Varchar2,
p_vParam2               IN          Varchar2,
p_vParam3               IN          Varchar2,
p_vParam4               IN          Varchar2,
MARK_CODE               OUT NOCOPY  g_tMarkCd,  
EQPUN_NBR               OUT NOCOPY  g_tEqpunNbr,
CSTMR _ID               OUT NOCOPY  g_tCstmrId,
CNSGN_CSTMR_ID          OUT NOCOPY  g_tCstmrId,
SHPR_CSTMR_ID           OUT NOCOPY  g_tCstmrId);

где TYPE g_tMarkCd IS TABLE OF my_table.my_varchar_column%TYPE (и другие типы похожи).

К сожалению, процедура не возвращает Ref Cursor.

OLE DB:

Существующий код устанавливает OleDbCommand с CommandType of Text, а CommandText имеет значение

"{call MY_SCHEMA.RetrieveInfo(?,?,?,?,{resultset 10000,MARK_CODE,EQPUN_NBR,SHPR_CSTMR_ID,CNSGN_CSTMR_ID,CSTMR_ID})}"

Затем вызывается процедура, добавляя четыре входных OleDbParameter к объекту OleDbCommand (но не добавляя никаких параметров OUT), а затем вызывая метод OleDbCommand ExecuteReader(). Все работает с OLE DB. Результирующий IDataReader имеет поля для каждого из выходных параметров.

ODP:

ODP не поддерживает синтаксис SQL (поэтому я установил для OracleCommand CommandText имя proc и для CommandType значение StoredProcedure).

Есть ли способ настроить клиентский код C# таким образом, чтобы я мог вызывать метод OracleCommand ExecuteReader() так же, как в OLE DB?

(Если мне нужно явно установить переменные OUT в качестве параметров в команде, то системе потребуется серьезное переписывание, которого я бы хотел избежать, если это вообще возможно.)

РЕДАКТИРОВАТЬ: (быть устаревшим) код OLEDB был похож

objCommand = new OleDbCommand(); 
objCommand.Connection = oledbConnection; 
objCommand.CommandText = "{call MY_SCHEMA.RetrieveInfo(?,?,?,?,{resultset 10000,MARK_CODE,EQPUN_NBR,SHPR_CSTMR_ID,CNSGN_CSTMR_ID,CSTMR_ID})}";
objCommand.CommandType = CommandType.Text; 

objCommand.Parameters.Add(new OracleParameter("", OracleDbType.Varchar2, ParameterDirection.Input, 2000, value)); 
// repeat for the other input parameters, but not output parameters
IDataReader rdr = objCommand.ExecuteReader();
// the resulting data reader has field count = 5

0 ответов

Другие вопросы по тегам