2011-02-23 56 views
1

查询我的查询序列:多个“立即执行”,在甲骨文

begin 
execute immediate 'drop table mytable1'; 
exception when others then null; 
end; 

begin 
execute immediate 'drop table mytable2'; 
exception when others then null; 
end; 

begin 
execute immediate 'drop table mytable3'; 
exception when others then null; 
end; 

但是当我尝试在SQL便签来执行它,它说“遇到的符号开始”,它指出了我所有的疑问必须在一个开始... 如果我删除所有开始结束exept的第一个开始和最后一个结束它给我 “无效的SQL语句”如何执行多个下拉表或多个创建表与上部模式,并检查如果表存在?我知道,我与exception when others then null;的风格被认为是类似于空抓不好的做法()'ES在其他语言,但多数民众赞成我来检查表是否存在/不存在于甲骨文

+0

'那FO的最简单方法r我检查一个表是否存在/不存在于oracle中 - 您可以查询'USER_TABLES' /'DBA_TABLES' /'ALL_TABLES' – Sathya

+0

另外,为什么在存储过程中使用DDL? – Sathya

回答

1
BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable1'; 

    EXECUTE IMMEDIATE 'drop table mytable2'; 

    EXECUTE IMMEDIATE 'drop table mytable3'; 
EXCEPTION 
    WHEN OTHERS THEN 
    NULL; 
END; 

正常工作的最简单的方法。


如果你问我,应该避免使用exception when others then null。如果你想检查一个表是否存在 - 查询USER_TABLES

DECLARE 
    V_EXISTS NUMBER; 

BEGIN 

SELECT 1 INTO V_EXISTS FROM USER_TABLES WHERE TABLE_NAME = 'TEST'; 

IF V_EXISTS = 1 THEN 
    EXECUTE IMMEDIATE 'DROP TABLE TEST'; 
END IF; 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Table not found'); 
END; 

REGd中:你的评论,如果你仍然想去关于你的问题使用方法,在外面匿名块把它包

BEGIN 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable1'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable2'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

    BEGIN 
    EXECUTE IMMEDIATE 'drop table mytable3'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

END; 

结果:

SQL> BEGIN 
    2 
    3 BEGIN 
    4  EXECUTE IMMEDIATE 'drop table mytable1'; 
    5 EXCEPTION 
    6  WHEN OTHERS THEN 
    7  NULL; 
    8 END; 
    9 
10 BEGIN 
11  EXECUTE IMMEDIATE 'drop table mytable2'; 
12 EXCEPTION 
13  WHEN OTHERS THEN 
14  NULL; 
15 END; 
16 
17 BEGIN 
18  EXECUTE IMMEDIATE 'drop table mytable3'; 
19 EXCEPTION 
20  WHEN OTHERS THEN 
21  NULL; 
22 END; 
23 
24 END; 
25 
26/

PL/SQL procedure successfully completed. 

SQL> 
+0

但是,如果第一个drop引发异常 - 其他两个不会尝试执行。有没有办法执行它们,如果第一次抛出异常表不存在? – Dominating

+0

将每个'立即执行'包裹在另一个匿名块中。 @Dominating – Sathya