EF CORE 调用 Oracle11g 的输出参数上的“数字或值错误”
Posted
技术标签:
【中文标题】EF CORE 调用 Oracle11g 的输出参数上的“数字或值错误”【英文标题】:"numeric or value error" on the output parameter of EF CORE call to Oracle11g 【发布时间】:2020-12-08 09:17:54 【问题描述】:我遵循了所有我能获得的在线帮助并想出了这个:
存储过程:
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>
看看它是否对您的工具敲响了警钟。祝你好运!
【讨论】:
感谢尝试...问题实际上发生在 .NET CORE 和 Oracle 之间...如您所见,.NET CORE 通过 Oracle 端的绑定变量将变量传递给 oracle。不知何故,这种交接是行不通的。我知道问题所在,只是不知道如何解决。 不客气,很抱歉我帮不上忙,我不使用这些工具。我希望其他人能够提供帮助。【参考方案2】:问题解决了:
出于某种原因,我必须明确设置输出变量的大小。
token.Size = '10';
【讨论】:
以上是关于EF CORE 调用 Oracle11g 的输出参数上的“数字或值错误”的主要内容,如果未能解决你的问题,请参考以下文章
Linux Redhat 7 完美删除/卸载Oracle 11g