c# - C# 中的 PLSQL 过程参数

标签 c# oracle

我们的 Oracle (11.2.0.4) 数据库有一个包 XXXX,我需要调用它的函数之一:

function GET_CLOB(
   P_TYPE OUT varchar2,
   P_MSG  OUT varchar2,
   P_BODY OUT clob
 ) return pls_integer;

我尝试在 C# 中使用以下代码来调用它:

var cm = con.CreateCommand();
cm.CommandText = "Z$XXX.GET_CLOB";
cm.CommandType = CommandType.StoredProcedure;
cm.BindByName = true;
cm.Parameters.Add("Return_Value", OracleDbType.Int16,
                   ParameterDirection.ReturnValue);
cm.Parameters.Add("P_TYPE", OracleDbType.Varchar2, 128).Value = "ForExDealRcvRq";
cm.Parameters.Add("P_MSG", OracleDbType.Varchar2, 128, 
                  ParameterDirection.Output);
cm.Parameters.Add("P_BODY", OracleDbType.Clob, ParameterDirection.Output);
cm.ExecuteScalar();

当没有数据可从数据库检索时,代码执行正常,并且我得到返回值,这意味着基础表为空。但是当有数据要检索时,我收到以下错误:

ORA-01017: Invalid Username/Password
ORA-06512:   "IBS.RTL", line 6505
ORA-06512:   "IBS.RTL", line 6515
ORA-06512:   "IBS.Z#aaaa", line 465
ORA-06512:   "IBS.Z$bbbb", line 71
ORA-06512:   "IBS.Z$bbbb", line 121
ORA-06512:   "IBS.Z$XXXX", line 433
ORA-06502: PL/SQL: : character string buffer too small
ORA-06512:   line 1

我尝试使用参数类型和大小,但无能为力。有什么建议可以去哪里看吗?

最佳答案

我认为你应该为所需的参数设置大小,因为这个错误ORA-06502: PL/SQL: : string buffer toosmall可能是由于你没有设置参数大小而引起的。

从您的代码中,我注意到您没有设置参数“P_MSG”的大小,只是将参数值设置为128。

这是您用来添加“P_MSG”参数的重载。

Add(string name, OracleDbType dbType, object val, ParameterDirection dir)

此方法使用提供的名称、数据库类型、参数值和方向将 OracleParameter 对象添加到集合中。

那么我认为你应该编写这样的示例

var oParam = New OracleParameter("P_MSG", OracleDbType.Varchar2);
oParam.Direction = ParameterDirection.Output;
oParam.Size = 128;
cm.Parameters.Add(oParam);

关于c# - C# 中的 PLSQL 过程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21926500/

相关文章:

c# - 将列中的 XML 转换为表

c# - 尝试通过无效的数组更改标签的颜色?

java - 道: diffrence between InMemory implementation and Database Implementation

java - 使用列名从 ResultSet 获取小写列

mysql - 提高 pentaho 表输入步骤性能

SAS 数据集中的 Oracle 表

c# - C# 中的双按位非(~~)

c# - 优先队列应用

Oracle 高级队列 - 订阅者消息跟踪

c# - 具有一个类的多个公共(public)别名的类库