动态异常中的异常

时间:2018-09-01 08:37:45

标签: oracle exception plsql ddl

我已经遇到了一个问题。如果表存在,我们必须将表放入程序中。如果不存在,则必须创建表。

所以我们要写

execute immediate 'Drop table emp';

如果emp表不存在,那么上面的语句应该给出异常,然后我们将创建emp表,我们如何做到不检入user_tablesall_tables

2 个答案:

答案 0 :(得分:4)

我认为您可以使用这种方式:

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)等。

您可以参考Exception Handling and Related Codes

答案 1 :(得分:3)

这是家庭作业吗?

如果否,那么这将是一个很差的设计。您不应该动态创建表,更好地截断数据。

如果是,则具有异常名称的解决方案将是以下解决方案:

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;