0

我正在重构现有应用程序以将 Oracle 数据提供程序从 OLE DB 更改为托管 Oracle 数据提供程序 (ODP)。

我需要调用以下存储过程,它有几个输入参数和几个输出参数,它们基本上是 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);

where TYPE g_tMarkCd IS TABLE OF my_table.my_varchar_column%TYPE(和其他类型类似)。

不幸的是,该过程不返回参考光标。

OLE 数据库:

现有代码设置了一个 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 参数)来调用 proc,然后调用 OleDbCommand ExecuteReader() 方法。一切都适用于 OLE DB。生成的 IDataReader 具有每个输出参数的字段。

耗氧量:

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
4

0 回答 0