我一直给的情况。如果表中存在,我们必须删除过程中的表。如果它不存在,我们必须创建表。
所以我们会写
execute immediate 'Drop table emp';
如果EMP表不存在,那么上面的语句应该给异常,然后我们将创建emp
表,我们该怎么做,没有在user_tables
或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;
如果存在运行时下降表,如果不存在滴表。
我们有一些例外名spesific的错误代码,而不是使用广义一个OTHERS
,从关键字sqlcode
比如返回:
ZERO_DIVIDE(-1476)
,TOO_MANY_ROWS(-1422)
,VALUE_ERROR(-6502)
,INVALID_NUMBER(-1722)
..等等。
这是一门功课?
如果没有,那么这将是一个相当糟糕的设计。你不应该创建表动态,更好地截断数据。
如果是,则用异常名的解决方案会是这样:
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;