Вызов хранимой процедуры из кода C # в веб-приложении возвращает PL / SQL: ошибка числа или значения: слишком маленький буфер строки символов - PullRequest
0 голосов
/ 05 июня 2018

Я создал хранимую процедуру в Oracle 12c, и для устранения проблемы я сократил ее до простого возврата 2 выходных значений.Я попытался запустить хранимую процедуру в SQL Developer, и она возвращает ожидаемые значения.Однако, когда я вызываю его из своего кода C #, я получаю следующую ошибку в Visual Studio 2015:

ORA-06502: PL / SQL: ошибка числа или значения: слишком маленький буфер строки символов

ORA-06512: в \ " MY_PROCEDURE ", строка 32

ORA-06512: в строке 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;

Любая помощьочень ценится.Я чувствую, что мне просто не хватает чего-то маленького, чтобы это исправить.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Попробуйте это:

oraComm.Parameters.Add("P_CODE", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output);
oraComm.Parameters["P_CODE"].DbType = DbType.String;
0 голосов
/ 06 июня 2018

Понятия не имею, почему это работает, но решение Боба дало мне идею.Я решил просто разбить код параметра в моем коде 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);

Еще раз спасибо за все ответы.

0 голосов
/ 05 июня 2018

Одна проблема, которую я вижу, состоит в том, что для строкового выходного параметра не установлена ​​максимальная длина.Измените настройку параметра P_CODE в коде C # на

oraComm.Parameters.Add("P_CODE", 
                       Oracle.DataAccess.Client.OracleDbType.Varchar2, 
                       32767,
                       ParameterDirection.Output);

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...