我已经遇到了一个问题。如果表存在,我们必须将表放入程序中。如果不存在,则必须创建表。
所以我们要写
execute immediate 'Drop table emp';
如果emp表不存在,那么上面的语句应该给出异常,然后我们将创建emp
表,我们如何做到不检入user_tables
或all_tables
答案 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)
等。
答案 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;