Исключение в динамическом исключении - PullRequest
0 голосов
/ 01 сентября 2018

Мне дали ситуацию. Если таблица существует, мы должны отбросить таблицу внутри процедуры. если он не существует, мы должны создать таблицу.

поэтому мы напишем

execute immediate 'Drop table emp';

если таблица emp не существует, то приведенное выше выражение должно дать исключение, а затем мы создадим таблицу emp. Как мы можем это сделать, не регистрируя user_tables или all_tables

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Это домашняя работа?

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

Если да, то решение с именами исключений будет таким:

DECLARE
  TABLE_DOES_NOT_EXIST EXCEPTION;
  PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942);
begin
  execute immediate 'Drop table emp';
exception 
   when TABLE_DOES_NOT_EXIST then
      execute immediate 'Create table emp(id int,name varchar2(50),surname varchar2(50))';
end;
0 голосов
/ 01 сентября 2018

Я думаю, вы можете использовать такой способ:

begin
  execute immediate 'Drop table emp';
 exception when others then
   begin
    if ( sqlcode = -942 ) then
    execute immediate 'Create table emp(id int,name varchar2(50),surname varchar2(50))';
    end if;
   end; 
end;

при запуске удаляет таблицу, если существует, если не существует, удаляет таблицу.

У нас есть некоторые имена исключений, специфичные для кодов ошибок, вместо использования обобщенного OTHERS, возвращающегося из ключевого слова sqlcode, такого как:

ZERO_DIVIDE(-1476), TOO_MANY_ROWS(-1422), VALUE_ERROR(-6502), INVALID_NUMBER(-1722) .. и т. Д.

Вы можете ссылаться Обработка исключений и связанные с ними коды

...