为什么这个代码块在NULL的情况下没有错误。并引发错误(ORA-06502: PL/SQL: numeric或value error)?
BEGIN
IF 'x' = 1 THEN
NULL;
--dbms_output.put_line('test');
END IF;
END;
发布于 2019-06-19 16:34:22
我认为您的情况是将编译参数PLSQL_OPTIMIZE_LEVEL
设置为一个足够高的值,以允许编译器优化您的代码。
因此,当您在IF
语句中包含NULL;
时,可以重写该语句,以便在编译时删除该IF
语句。
但是,由于IF
语句中存在NULL;
以外的内容,因此不能再将其删除,因此将生成检查'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或更低,它不会。
https://stackoverflow.com/questions/56662857
复制相似问题