ora-06502:pl/sql:串联时出现数字或值错误

k97glaaz  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(308)
DECLARE
    a NUMBER;
    b NUMBER;
BEGIN
    a :=: a;
    b :=: b;
    DBMS_OUTPUT.PUT_LINE('sum = '|| a+b);
END;

我得到的错误为数字或值错误

t5zmwmid

t5zmwmid1#

问题在于运算符优先级:
oracle在表达式中从左到右以相等的优先级计算运算符。
... 如表所示 + 以及 || 有同等的优先权。所以在这个声明中:

DBMS_OUTPUT.PUT_LINE('sum = '|| a+b);

这被解释为 'sum = '|| a 这就给了你一条线 <result string> + b ,如果字符串不能隐式转换为数字,则string+number将导致错误 'sum = 1' 不可能。
可以添加圆括号以替代默认优先级:

DBMS_OUTPUT.PUT_LINE('sum = '|| (a+b));

db<>小提琴

7eumitmz

7eumitmz2#

澄清问题的简化版本:

begin
    dbms_output.put_line('Result ' || 2 + 2);
end;
/

ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2

这会失败,因为表达式是从左到右构建的,并且您不能添加 2 到字符串 'Result: 2' .
它可以与乘法或除法一起工作,因为算术优先级会首先计算这些运算。

begin
    dbms_output.put_line('Result ' || 2 / 2);
end;
/

Result 1

PL/SQL procedure successfully completed.

要使其适用于任何操作,需要将表达式括起来:

begin
    dbms_output.put_line('Result ' || (2 + 2));
end;
/

Result 4

PL/SQL procedure successfully completed.

只需补充一点,在后面不留任何空格就可以编写主机/绑定变量 : ,例如 :myvar 而不是 : myvar .

tquggr8v

tquggr8v3#

您没有看到sqldeveloper错误,而是在sqldeveloper中运行sql语句时出现错误,这是非常不同的。为了简单起见,我在示例中声明变量,而不是像您那样使用绑定变量:

DECLARE
    a NUMBER;
    b NUMBER;
BEGIN
    a := 1;  
    b := 2;    
    DBMS_OUTPUT.PUT_LINE('sum = '||a+b);
END;

返回ora-06502:pl/sql:数值或值错误:字符到数字转换错误ora-06512:第7行的重要信息是“第7行”。dbms\ U output语句中出现故障,原因是运算符优先级。最好的方法是告诉数据库引擎您希望将数字连接到字符串,错误表明发生了隐式转换。
以下工作正常:

DECLARE
    a NUMBER;
    b NUMBER;
BEGIN
    a := 1;  
    b := 2;    
    DBMS_OUTPUT.PUT_LINE('sum = '|| TO_NUMBER(a+b));
END;

还有一句话。此语法

a :=: a;

工作,但非常混乱。我会为绑定变量使用更具描述性的名称,并分隔赋值运算符 := 从bind变量。这样写更容易阅读:

a := :variablea;

相关问题