动态异常中的异常

Exception in Dynamic exception

我已经给出了一个情况。如果 table 存在,我们必须在程序中删除 table。如果它不存在,我们必须创建 table.

所以我们会写

execute immediate 'Drop table emp';

如果 emp table 不存在,那么上面的语句应该给出异常,然后我们将创建 emp table,我们如何在不检查 [=12= 的情况下做到这一点] 或 all_tables

我想你可以用这样的方式:

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;

当 运行 存在时丢弃 table,如果不存在则丢弃 table。

我们有一些特定于错误代码的异常名称,而不是使用通用名称 OTHERS,从关键字 sqlcode 返回,例如:

ZERO_DIVIDE(-1476)TOO_MANY_ROWS(-1422)VALUE_ERROR(-6502)INVALID_NUMBER(-1722) ..等

您可以参考Exception Handling and Related Codes

这是作业吗?

如果不是,那么这将是一个相当糟糕的设计。您不应该动态创建 table,最好截断数据。

如果是,那么具有异常名称的解决方案就是这个:

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;