Обработка ошибок Oracle

У меня такой код:

DECLARE e_not_exist EXCEPTION; PRAGMA EXCEPTION_INIT(e_not_exist, -942); car_name VARCHAR2(20); BEGIN select name_of_factory into car_name from car where car_id = 1; dbms_output.put_line(car_name); EXCEPTION when e_not_exist then dbms_output.put_line('Table or view does not exist'); when OTHERS then dbms_output.put_line(to_char(SQLCODE)); END; 

На самом деле, мое имя таблицы – CARS, но не CAR. Но оракул не справляется с этим исключением и дает мне ошибку ORA-00942: таблицы или представления не существует. Как я могу обработать это исключение?

Вы не можете сделать это со статическим SQL. Ошибка возникает, когда код компилируется, а не выполняется. Попробуйте это вместо этого:

  execute immediate 'select name_of_factory from car where car_id = 1' into car_name ; 

Ошибка ORA-00942, как правило, будет ошибкой времени компиляции. Oracle должен решить имя (имена) таблиц во время компиляции. Обработчики исключений будут ломать ошибки во время выполнения, а не время компиляции.

Если вы использовали динамический SQL, вы можете отложить разрешение имен во время выполнения, после чего вы можете поймать исключение, т. Е.

 SQL> ed Wrote file afiedt.buf 1 declare 2 no_such_table exception; 3 pragma exception_init( no_such_table, -942 ); 4 l_cnt integer; 5 begin 6 execute immediate 'select count(*) from emps' into l_cnt; 7 exception 8 when no_such_table 9 then 10 dbms_output.put_line( 'No such table' ); 11* end; SQL> / No such table PL/SQL procedure successfully completed. 

Но это не разумный способ, в общем, написать хранимые процедуры. Ваши процедуры должны знать, какие таблицы существуют, а синтаксические ошибки должны быть идентифицированы и разрешены во время разработки, а не во время выполнения.