ORA 06502错误PL / SQL

时间:2013-12-04 04:27:06

标签: sql oracle plsql oracle11g

我正在尝试执行一个简单的语句,并在执行时出错。

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;

有谁知道背后的原因?

2 个答案:

答案 0 :(得分:10)

应该是Operator Precedence

乘法具有比串联更高的优先级。因此,'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不会偶然选择等同连接的错误一面进行转换。