Почему при возникновении ошибки не выполняется код до строки с ошибкой?

Намеренно пытаюсь изменить значение notice_period_in_days, чтобы посмотреть, какую ошибку получу.

Вот PL/SQL код:

set serveroutput on;

declare 
    notice_period_in_days CONSTANT NUMBER := 60;
begin 
    dbms_output.put_line (notice_period_in_days);
    notice_period_in_days := 50;
    dbms_output.put_line (notice_period_in_days);
end;

Это вызывает, как и ожидалось, ошибку:

PLS-00363: expression 'NOTICE_PERIOD_IN_DAYS' cannot be used as an assignment target

Но почему первая строка вывода dbms_output.put_line не выполняется? Ожидаю ошибку только в той строке, где присваивается новое значение для notice_period_in_days.

Как можно это объяснить?


Свободный перевод вопроса What happens if I edit a constant value in PL SQL? от участника @Surender Raja


Ответы (1 шт):

Автор решения: 0xdb

После отправки блока на сервер БД, он сначала компилируется в выполняемый интерпретатором PL/SQL байт-код, и только если никаких ошибок при этом не возникнет, блок будет запущен на выполнение.

Если посмотреть полное сообщение об ошибке:

SQL> declare n constant int := 0;
  2  begin n := 10;
  3  end;
  4  /
begin n := 10;
      *
ERROR at line 2:
ORA-06550: line 2, column 7:
PLS-00363: expression 'N' cannot be used as an assignment target
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored

, то первая строка ошибки:

$ oerr ora 6550
06550, 00000, "line %s, column %s:\n%s"
// *Cause:  Usually a PL/SQL compilation error.

говорит, что произоша ошибка компиляции. То есть, блок вообще не был запущен на выполнение.

→ Ссылка