我正在尝试执行一个简单的语句,并在执行时出错。
begin
dbms_output.put_line('Addition: '||4+2);
end;
错误: ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误 ORA-06512:第2行
但是当我用*运算符执行时,它运行正常。
begin
dbms_output.put_line('Addition: '||4*2);
end;
有谁知道背后的原因?
答案 0 :(得分:10)
乘法具有比串联更高的优先级。因此,'Addition: '||4*2
评估为'Addition: '||8
和'Addition: 8'
。
添加具有与连接相同的优先级,并且具有相同优先级的运算符从左到右进行求值。
因此,'Addition: '||4+2
评估为'Addition: 4' + 2
,后来失败,因为您无法为字符添加数字。
在这种情况下,您应该始终使用括号来明确指定评估顺序,例如'Addition: '|| (4+2)
答案 1 :(得分:1)
在我看来,实际问题是这段代码依赖于Oracle内核的隐式数据类型转换。 始终使用显式数据类型转换。例如:
开始 dbms_output.put_line('加法:'|| to_char(4 + 2)); 端;
在许多其他情况下,由于隐式数据类型转换,您将遇到意外错误。就像将varchar与数字相等地加入一样。只要varchar只包含数值,它就可以正常工作(尽管由于索引没有被使用,可能会很慢)。但是,只要您插入一行非数字数据,就会在遇到该行时遇到错误。明确地进行数据类型转换可确保Oracle不会偶然选择等同连接的错误一面进行转换。