«ошибка числа или значения» в выходном параметре вызова ядра EF в Oracle11g

#stored-procedures #.net-core #oracle11g #entity-framework-core #output-parameter

#хранимые процедуры #.net-ядро #oracle11g #entity-framework-core #выходной параметр

Вопрос:

Я следил за всей онлайн-справкой, которую смог получить, и придумал это:

Хранимая процедура:

 create or replace procedure            proc_cmap_unit_test 
(
  param1 in varchar2
  ,tkn out varchar2
) as 
  begin
    select 'hello' into tkn from dual;
  null;
end proc_cmap_unit_test;
  

В .Net CORE у меня есть эти:

 OracleParameter param1 = new OracleParameter
  (
    "param1"
    , OracleDbType.Varchar2
    , ParameterDirection.Input
  );

OracleParameter token = new OracleParameter
  (
    "tkn"
    , OracleDbType.Varchar2
    , ParameterDirection.Output
  );

cntxt.Database
     .ExecuteSqlCommand($"BEGIN PROC_CMAP_UNIT_TeST(:param1, :tkn); end;", param1, token);
  

После того, как я запустил код, я получил эту глупую ошибку:

ORA-06502: PL/ SQL: ошибка числового значения

Кто-нибудь может сказать мне, чего я не понимаю? Спасибо!

Ответ №1:

Я не знаю инструментов, которые вы используете, но — что касается Oracle, вот как это происходит:

Ваша процедура:

 SQL> CREATE OR REPLACE PROCEDURE proc_cmap_unit_test (param1  IN     VARCHAR2,
  2                                                   tkn        OUT VARCHAR2)
  3  AS
  4  BEGIN
  5     SELECT 'hello' INTO tkn FROM DUAL;
  6
  7     NULL;
  8  END proc_cmap_unit_test;
  9  /

Procedure created.
  

Тестирование:

 SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     l_out  VARCHAR2 (10);                       --> this! "hello" fits in here
  3  BEGIN
  4     proc_cmap_unit_test ('a', l_out);
  5     DBMS_OUTPUT.put_line (l_out);
  6  END;
  7  /
hello

PL/SQL procedure successfully completed.
  

Но, если переменная, которая должна принимать значение OUT параметра процедуры, слишком мала, произойдет сбой:

 SQL> DECLARE
  2     l_out  VARCHAR2 (1);                      --> this! "hello" can't fit
  3  BEGIN
  4     proc_cmap_unit_test ('a', l_out);
  5     DBMS_OUTPUT.put_line (l_out);
  6  END;
  7  /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "DP_4005.PROC_CMAP_UNIT_TEST", line 5
ORA-06512: at line 4


SQL>
  

Посмотрите, не напоминает ли это о вашем инструменте. Желаю удачи!

Комментарии:

1. спасибо за попытку… проблема на самом деле возникает между . СЕТЕВОЕ ЯДРО и Oracle…as видите ли, .NET CORE передает переменную oracle через переменную привязки на стороне Oracle. Почему-то это отключение не работает. Я знаю проблему, просто не знаю, как ее исправить.

2. Добро пожаловать, и я сожалею, что больше ничем не могу помочь, я не использую эти инструменты. Я надеюсь, что кто-то еще сможет помочь.

Ответ №2:

Проблема решена:

По какой-то причине я должен явно задать размер выходной переменной.

 token.Size = '10';