【发布时间】:2015-05-26 05:59:45
【问题描述】:
我们可以使用以下查询来检查 T-SQL 中是否存在对象。
IF OBJECT_ID('TBL_COMP_ASSESSMENT') IS NOT NULL
DROP TABLE TBL_COMP_ASSESSMENT
有没有办法在 Oracle 中实现这一点?
【问题讨论】:
我们可以使用以下查询来检查 T-SQL 中是否存在对象。
IF OBJECT_ID('TBL_COMP_ASSESSMENT') IS NOT NULL
DROP TABLE TBL_COMP_ASSESSMENT
有没有办法在 Oracle 中实现这一点?
【问题讨论】:
您可以使用 ALL_OBJECTS 表。应该这样做:
SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = '<OBJ_NAME_HERE>'
您可以根据需要添加更多条件:
AND OWNER='<OWNER>' AND OBJECT_TYPE='<TYPE>'
详情请看:http://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2005.htm
【讨论】:
你可以用
查看 begin
if ObjType = 'TABLE' then
select count(*) into v_counter from user_tables where table_name = upper(ObjName);
if v_counter > 0 then
execute immediate 'drop table ' || ObjName || ' cascade constraints';
end if;
end if;
end;
【讨论】:
动态DROP和CREATE表是个坏主意。 T-SQL 和 PL/SQL 非常不同。 PL/SQL 在执行之前编译并驻留在数据库中。您在 T-SQL 中所做的事情在 PL/SQL 中可能并不好。您可以TRUNCATE 表格,而不是即时删除它。
无论如何,如果你真的想这样做,那么你需要(ab)使用 EXECUTE IMMEDIATE 来做到这一点。
例如,
SQL> DECLARE
2 cnt NUMBER;
3 BEGIN
4 SELECT Count(*)
5 INTO cnt
6 FROM user_tables
7 WHERE table_name = 'TBL_COMP_ASSESSMENT';
8
9 IF cnt = 1 THEN
10 BEGIN
11 EXECUTE IMMEDIATE 'DROP TABLE TBL_COMP_ASSESSMENT';
12 EXCEPTION
13 WHEN OTHERS THEN
14 IF SQLCODE != -942 THEN
15 RAISE;
16 END IF;
17 END;
18 END IF;
19 END;
20
21 /
PL/SQL procedure successfully completed.
SQL>
【讨论】: