异常动态异常

问题描述 投票:1回答:2

我一直给的情况。如果表中存在,我们必须删除过程中的表。如果它不存在,我们必须创建表。

所以我们会写

execute immediate 'Drop table emp';

如果EMP表不存在,那么上面的语句应该给异常,然后我们将创建emp表,我们该怎么做,没有在user_tablesall_tables检查

oracle exception plsql ddl
2个回答
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;

如果存在运行时下降表,如果不存在滴表。

我们有一些例外名spesific的错误代码,而不是使用广义一个OTHERS,从关键字sqlcode比如返回:

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

你可以参考Exception Handling and Related Codes


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;
© www.soinside.com 2019 - 2024. All rights reserved.