Почему сравнение varchar / число работает - PullRequest
2 голосов
/ 19 июня 2019

Почему этот блок не выдает ошибку с NULL; внутри. И вызывает ошибку (ORA-06502: PL / SQL: ошибка числа или значения) с любой другой инструкцией внутри?

BEGIN
  IF 'x' = 1 THEN
    NULL;
  --dbms_output.put_line('test');
  END IF;
END;

1 Ответ

6 голосов
/ 19 июня 2019

Я думаю, что в вашем случае происходит то, что у вас есть параметр компиляции 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 или ниже, и не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...