为什么该块没有错误,所以为NULL;内。并在其中包含任何其他指令的情况下引发错误(ORA-06502:PL / SQL:数字或值错误)?
BEGIN
IF 'x' = 1 THEN
NULL;
--dbms_output.put_line('test');
END IF;
END;
答案 0 :(得分:6)
我认为您遇到的情况是,您已将编译参数PLSQL_OPTIMIZE_LEVEL
设置为一个足够高的值,以允许编译器优化您的代码。
因此,当NULL;
语句中包含IF
时,可以对其进行重写以在编译时删除该IF
语句。
但是,NULL;
语句中包含IF
以外的其他内容,则无法再将其删除,因此将进行检查'x' = 1
。 Oracle将字符值与数字进行比较时会将其转换为数字,因此在您的情况下,这意味着比较失败,因为x
不是数字。
例如:
以下作品:
ALTER SESSION SET plsql_optimize_level = 2;
BEGIN
IF 'x' = 1 THEN
NULL;
--dbms_output.put_line('test');
END IF;
END;
/
但是以下操作失败:
ALTER SESSION SET plsql_optimize_level = 1;
BEGIN
IF 'x' = 1 THEN
NULL;
--dbms_output.put_line('test');
END IF;
END;
/
唯一的区别是PLSQL_OPTIMIZE_LEVEL
值-2或更高,编译器将优化不相关的IF
语句(1或更低),但不会。