Поставщик данных 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