我们的 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/