Calling stored procedure from C# code in web application returns PL/SQL: numeric or value error: character string buffer too small
Calling stored procedure from C# code in web application returns PL/SQL: numeric or value error: character string buffer too small
我在 Oracle 12c 中创建了一个存储过程,为了调试问题,我将其减少为仅返回 2 个输出值。我已经尝试 运行 SQL Developer 中的存储过程,它 returns 我期望的值。但是,当我从我的 C# 代码调用它时,我在 Visual Studio 2015 中收到以下错误:
ORA-06502: PL/SQL: numeric or value error: character string buffer too
small
ORA-06512: at \"MY_PROCEDURE", line 32
ORA-06512: at line 1
这是我的 C# 代码:
Oracle.DataAccess.Client.OracleConnection oraconn = new Oracle.DataAccess.Client.OracleConnection("My Connection String");
Oracle.DataAccess.Client.OracleCommand oraComm = new Oracle.DataAccess.Client.OracleCommand("MY_PROCEDURE", oraconn);
oraComm.Parameters.Add("P_REGISTRATION_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_OFFICE_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_SERIES_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_USER_UPDATING", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Input);
oraComm.Parameters.Add("P_CODE", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Output);
oraComm.Parameters.Add("P_NUM", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Output);
oraComm.CommandType = CommandType.StoredProcedure;
oraconn.Open();
oraComm.ExecuteNonQuery();
var ticketCode = oraComm.Parameters["P_CODE"].ToString();
var ticketNum = oraComm.Parameters["P_NUM"].ToString();
这是存储过程 - 我已将其缩减为仅向输出参数提供值,即使这样我仍然会遇到相同的错误:
PROCEDURE MY_PROCEDURE(
P_REGISTRATION_ID IN NUMBER,
P_OFFICE_ID IN NUMBER,
P_SERIES_ID IN NUMBER,
P_USER_UPDATING IN VARCHAR2,
P_CODE OUT VARCHAR2,
P_NUM OUT NUMBER)
AS
BEGIN
P_CODE := 'AA';
P_NUM := 1;
END INS_REGISTRATION_QS_PR;
非常感谢任何帮助。我觉得我只是缺少一些小东西来修复它。
我看到的一个问题是字符串输出参数没有设置最大长度。将C#代码中P_CODE参数的设置改为
oraComm.Parameters.Add("P_CODE",
Oracle.DataAccess.Client.OracleDbType.Varchar2,
32767,
ParameterDirection.Output);
祝你好运。
试试这个:
oraComm.Parameters.Add("P_CODE", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output);
oraComm.Parameters["P_CODE"].DbType = DbType.String;
我不知道为什么会这样,但 Bob 的解决方案给了我一个主意。我决定在我的 C# 代码中分解参数代码而不是使用构造函数并且它起作用了。
代码如下:
Oracle.DataAccess.Client.OracleParameter tcParam = new Oracle.DataAccess.Client.OracleParameter();
tcParam.ParameterName = "P_CODE";
tcParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
tcParam.Size = 10;
tcParam.Direction = ParameterDirection.Output;
oraComm.Parameters.Add(tcParam);
再次感谢大家的回复。
试试这个:
command.Parameters.Add("keys", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;
对我有用!
我在 Oracle 12c 中创建了一个存储过程,为了调试问题,我将其减少为仅返回 2 个输出值。我已经尝试 运行 SQL Developer 中的存储过程,它 returns 我期望的值。但是,当我从我的 C# 代码调用它时,我在 Visual Studio 2015 中收到以下错误:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at \"MY_PROCEDURE", line 32
ORA-06512: at line 1
这是我的 C# 代码:
Oracle.DataAccess.Client.OracleConnection oraconn = new Oracle.DataAccess.Client.OracleConnection("My Connection String");
Oracle.DataAccess.Client.OracleCommand oraComm = new Oracle.DataAccess.Client.OracleCommand("MY_PROCEDURE", oraconn);
oraComm.Parameters.Add("P_REGISTRATION_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_OFFICE_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_SERIES_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_USER_UPDATING", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Input);
oraComm.Parameters.Add("P_CODE", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Output);
oraComm.Parameters.Add("P_NUM", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Output);
oraComm.CommandType = CommandType.StoredProcedure;
oraconn.Open();
oraComm.ExecuteNonQuery();
var ticketCode = oraComm.Parameters["P_CODE"].ToString();
var ticketNum = oraComm.Parameters["P_NUM"].ToString();
这是存储过程 - 我已将其缩减为仅向输出参数提供值,即使这样我仍然会遇到相同的错误:
PROCEDURE MY_PROCEDURE(
P_REGISTRATION_ID IN NUMBER,
P_OFFICE_ID IN NUMBER,
P_SERIES_ID IN NUMBER,
P_USER_UPDATING IN VARCHAR2,
P_CODE OUT VARCHAR2,
P_NUM OUT NUMBER)
AS
BEGIN
P_CODE := 'AA';
P_NUM := 1;
END INS_REGISTRATION_QS_PR;
非常感谢任何帮助。我觉得我只是缺少一些小东西来修复它。
我看到的一个问题是字符串输出参数没有设置最大长度。将C#代码中P_CODE参数的设置改为
oraComm.Parameters.Add("P_CODE",
Oracle.DataAccess.Client.OracleDbType.Varchar2,
32767,
ParameterDirection.Output);
祝你好运。
试试这个:
oraComm.Parameters.Add("P_CODE", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output);
oraComm.Parameters["P_CODE"].DbType = DbType.String;
我不知道为什么会这样,但 Bob 的解决方案给了我一个主意。我决定在我的 C# 代码中分解参数代码而不是使用构造函数并且它起作用了。
代码如下:
Oracle.DataAccess.Client.OracleParameter tcParam = new Oracle.DataAccess.Client.OracleParameter();
tcParam.ParameterName = "P_CODE";
tcParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
tcParam.Size = 10;
tcParam.Direction = ParameterDirection.Output;
oraComm.Parameters.Add(tcParam);
再次感谢大家的回复。
试试这个:
command.Parameters.Add("keys", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;
对我有用!