Search code examples
c#oracle-databasestored-proceduresvisual-studio-2015oracle12c

Calling stored procedure from C# code in web application returns PL/SQL: numeric or value error: character string buffer too small


I have created a stored procedure in Oracle 12c and in order to debug the problem I've reduced it to just returning 2 output values. I have tried running the stored procedure in SQL Developer and it returns the values that I'm expecting. However, when I call it from my C# code, I get the following error in 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

This is my C# code:

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();

Here is the stored procedure - I've reduced it to just provide values to the output parameters and I still get the same error even with that:

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;

Any help is greatly appreciated. I feel like I'm just missing something small to fix it.


Solution

  • I have no idea why this worked, but Bob's solution gave me an idea. I decided to just break up the parameter code in my C# code instead of using the constructor and it worked.

    Here's the code:

    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);
    

    Thanks again for all the replies.