#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';