C # и Oracle: выходной параметр усекается - PullRequest
0 голосов
/ 24 января 2019

У меня другая проблема с C # и Oracle DB.Поэтому я выполняю хранимую процедуру и возвращаю параметр out, все работает нормально, но в конце мои выходные данные передаются наполовину.

create or replace PROCEDURE TEST(MyVar IN VARCHAR2, return_var OUT VARCHAR2) AS 
BEGIN
  DECLARE newId number;
  BEGIN
     SELECT (NVL(MAX(ID),0) + 1) 
       INTO newId 
       FROM MY_TABLE;

     INSERT INTO MY_TABLE
     VALUES (newId, sysdate, 'BEL', '3' , MyVar, 'var2', 'AZ', 'TR', 'FG', 'QW', 'XC', 'IO', '1', '0', sysdate, 'TT', 'BB', 'OO', '8', '9', sysdate, '5', '6');
  END;

  return_var := 'TESTRETURN';
END TEST;

Вот код C #:

OracleParameter out_param = oCommand.CreateParameter();
out_param.ParameterName = "return_code";
out_param.Direction = ParameterDirection.Output;
out_param.DbType = DbType.String;
out_param.Size = 300;
oCommand.Parameters.Add(out_param);
oCommand.ExecuteNonQuery();
Results = out_param.Value.ToString();

И я получаю это: TESTR вместо TESTRETURN

Если я заменю в процедуре Oracle TESTRETURN чем-то большим, например "THISCHAINHAVE20CARSX", я получил "THISCHAINH"

И если я заменю всего двумя буквами, у меня будет только одна ..

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Для параметров OUT вы должны / должны установить свойства DbType и OracleDbType

Попробуйте добавить

out_param.OracleDbType = OracleDbType.Varchar2;

к вашему коду перед его выполнением.

Более короткая версия вашего кода будет такой:

oCommand.Parameters.Add("return_code", OracleDbType.Varchar2, 300, null, ParameterDirection.Output);
oCommand.Parameters("return_code").DbType = DbType.String;

Возможно, вам придется использовать String.Empty вместо null

0 голосов
/ 24 января 2019

Работает при замене VARCHAR2 на CHAR

CREATE OR REPLACE PROCEDURE TEST(var1 IN VARCHAR2, return_code OUT VARCHAR2)

от

CREATE OR REPLACE PROCEDURE TEST(var1 IN VARCHAR2, return_code OUT CHAR)

Так что ошибка из этой темы относится и к сборке System.Data.OracleClient.dll.

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