Обработка ошибок Oracle - PullRequest
       32

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

4 голосов
/ 17 ноября 2010

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

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. Но oracle не обрабатывает это исключение и выдает ошибку ORA-00942: таблица или представление не существует Как я могу обработать это исключение?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2010

Ошибка 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.

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

6 голосов
/ 17 ноября 2010

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

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