如何将带有十进制值的数字作为参数传递给FUNCTION或PROCEDURE

Car*_*res 5 sql oracle stored-procedures oracle11g oracle-sqldeveloper

我正在创建一些过程和函数,以简化插入,删除或更新行的任务。我的问题听起来很傻,因为确定我缺少某些东西。

每当我尝试将十进制值作为参数传递给过程或函数时,都会收到错误消息。

ORA-06502:PL / SQL:数字或值错误:字符到数字的转换错误

下一个代码不起作用,而是一种显示问题的方法。

CREATE OR REPLACE FUNCTION test1(num1 NUMBER)
    RETURN NUMBER IS
        BEGIN
        RETURN num1;
        END;
/
SET SERVEROUTPUT ON;
DECLARE
    numVar NUMBER;
BEGIN
numVar:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar);

                      /***********Calling test1*************/
            DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2.1));

END;
/
Run Code Online (Sandbox Code Playgroud)

一些输出是西班牙语,但大多数是英语。

Function TEST1 compilado

Raw Number: 2,1


Error que empieza en la línea: 8 del comando :
DECLARE
    numVar NUMBER;
BEGIN
numVar:= 2.1;
DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar);
    DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2.1));

END;
Informe de error -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 6
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.
Run Code Online (Sandbox Code Playgroud)

当我调用没有十进制参数的函数时,我不会遇到麻烦

          /***********Calling test1*************/
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(2));
Run Code Online (Sandbox Code Playgroud)

输出量

Function TEST1 compilado

Raw Number: 2,1
Function Number: 2
Run Code Online (Sandbox Code Playgroud)

如果我传递变量而不是原始的十进制数,那么我也没有任何麻烦,实际上我可以使用十进制数,但是对于我来说,创建一个过程来插入数据需要定义一个变量以将其作为一个参数

         /***********Calling test1*************/
DBMS_OUTPUT.PUT_LINE('Function Number: '|| test1(numVar));
Run Code Online (Sandbox Code Playgroud)

输出量

Function TEST1 compilado
Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)

我想了解为什么不能将原始十进制数作为参数传递,也许我不太了解Oracle在将其作为参数引入之前如何转换数据。

fen*_*n1x 5

此问题似乎是 Oracle SQL Developer 特有的。

我有Oracle 11.2.0.3.0 64bit,当我在TOAD 12.0.0.61中测试它时,一切正常,但在Oracle SQL Developer 17.2.0.188中则不然。

我是如何测试的:

首先,创建过程:

CREATE OR REPLACE FUNCTION test_function(x$n in NUMBER)
RETURN NUMBER IS
BEGIN  
    RETURN x$n;
END;
Run Code Online (Sandbox Code Playgroud)

在 TOAD 中测试

测试#1,使用.

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';

DECLARE
    numVar$n NUMBER;
BEGIN
    numVar$n:= 2.1;
    DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
    DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));
END;
Run Code Online (Sandbox Code Playgroud)

输出:

Raw Number: 2.1
Function Number: 2.1
Run Code Online (Sandbox Code Playgroud)

测试#2,使用,

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';

DECLARE
    numVar$n NUMBER;
BEGIN
    numVar$n:= 2.1;
    DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
    DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));
END;
Run Code Online (Sandbox Code Playgroud)

输出:

Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)

在 Oracle SQL Developer 中测试

Oracle SQL Developer中,测试 #1 工作正常,但测试 #2 引发ORA-06502 - 这就是您的情况。

解决方案#1:使用to_number('2,1')而不是2.1

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';

DECLARE
    numVar$n NUMBER;
BEGIN
    numVar$n:= 2.1;
    DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
    DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(to_number('2,1')));
END;
Run Code Online (Sandbox Code Playgroud)

输出:

Raw Number: 2,1
Function Number: 2,1
Run Code Online (Sandbox Code Playgroud)

解决方案#2NLS_NUMERIC_CHARACTERS :在执行期间更改:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';

DECLARE
    numVar$n NUMBER;
    nnc$c VARCHAR2(255);
BEGIN
    numVar$n:= 2.1;

    SELECT value
    INTO   nnc$c
    FROM   nls_session_parameters
    WHERE  parameter = 'NLS_NUMERIC_CHARACTERS';

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''';

    DBMS_OUTPUT.PUT_LINE('Raw Number: '||numVar$n);
    DBMS_OUTPUT.PUT_LINE('Function Number: '||test_function(2.1));

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS='''||nnc$c||'''';
END;
Run Code Online (Sandbox Code Playgroud)

输出:

Raw Number: 2.1
Function Number: 2.1
Run Code Online (Sandbox Code Playgroud)