Я думаю, что в вашем случае происходит то, что у вас есть параметр компиляции PLSQL_OPTIMIZE_LEVEL
, установленный на достаточно высокое значение, чтобы компилятор мог оптимизировать ваш код.
Итак, если у вас есть NULL;
внутри вашего оператора IF
, его можно переписать, чтобы удалить этот оператор 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 или ниже, и не будет.