我正在重构现有的应用程序,以便将Oracle数据提供程序从OLE DB更改为托管Oracle数据提供程序(ODP)。
我需要调用以下存储过程,它有几个输入参数,以及几个OUT参数,基本上是VARCHAR2的TABLE类型
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为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()方法来调用proc。一切都适用于OLE DB。生成的IDataReader包含每个输出参数的字段。
ODP:
ODP不支持SQL语法(因此我将OracleCommand CommandText设置为proc的名称并将CommandType设置为StoredProcedure)。
有没有办法以与OLE DB相同的方式调用OracleCommand ExecuteReader()方法来设置C#客户端代码?
(如果我必须在命令中明确地将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