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 的输出参数上的“数字或值错误”的主要内容,如果未能解决你的问题,请参考以下文章

EF Core使用Simple Logging输出日志

如何使用 EF Core 5 执行存储过程 ORACLE?

Linux Redhat 7 完美删除/卸载Oracle 11g

9i oracle数据库迁移到11G

Centos 6.5 安装Oracle 11g R2 on vbox

ef core输出sql语句(abp vnext)