DECLARE a NUMBER; b NUMBER; BEGIN a :=: a; b :=: b; DBMS_OUTPUT.PUT_LINE('sum = '|| a+b); END;
我得到的错误为数字或值错误
t5zmwmid1#
问题在于运算符优先级:oracle在表达式中从左到右以相等的优先级计算运算符。... 如表所示 + 以及 || 有同等的优先权。所以在这个声明中:
+
||
DBMS_OUTPUT.PUT_LINE('sum = '|| a+b);
这被解释为 'sum = '|| a 这就给了你一条线 <result string> + b ,如果字符串不能隐式转换为数字,则string+number将导致错误 'sum = 1' 不可能。可以添加圆括号以替代默认优先级:
'sum = '|| a
<result string> + b
'sum = 1'
DBMS_OUTPUT.PUT_LINE('sum = '|| (a+b));
db<>小提琴
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' .它可以与乘法或除法一起工作,因为算术优先级会首先计算这些运算。
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 .
:
:myvar
: myvar
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;
3条答案
按热度按时间t5zmwmid1#
问题在于运算符优先级:
oracle在表达式中从左到右以相等的优先级计算运算符。
... 如表所示
+
以及||
有同等的优先权。所以在这个声明中:这被解释为
'sum = '|| a
这就给了你一条线<result string> + b
,如果字符串不能隐式转换为数字,则string+number将导致错误'sum = 1'
不可能。可以添加圆括号以替代默认优先级:
db<>小提琴
7eumitmz2#
澄清问题的简化版本:
这会失败,因为表达式是从左到右构建的,并且您不能添加
2
到字符串'Result: 2'
.它可以与乘法或除法一起工作,因为算术优先级会首先计算这些运算。
要使其适用于任何操作,需要将表达式括起来:
只需补充一点,在后面不留任何空格就可以编写主机/绑定变量
:
,例如:myvar
而不是: myvar
.tquggr8v3#
您没有看到sqldeveloper错误,而是在sqldeveloper中运行sql语句时出现错误,这是非常不同的。为了简单起见,我在示例中声明变量,而不是像您那样使用绑定变量:
返回ora-06502:pl/sql:数值或值错误:字符到数字转换错误ora-06512:第7行的重要信息是“第7行”。dbms\ U output语句中出现故障,原因是运算符优先级。最好的方法是告诉数据库引擎您希望将数字连接到字符串,错误表明发生了隐式转换。
以下工作正常:
还有一句话。此语法
工作,但非常混乱。我会为绑定变量使用更具描述性的名称,并分隔赋值运算符
:=
从bind变量。这样写更容易阅读: