如何在oracle中检查对象是否存在

时间:2015-03-23 09:37:50

标签: sql oracle tsql psql

我们可以使用以下查询在T-SQL中检查对象是否存在。

IF OBJECT_ID('TBL_COMP_ASSESSMENT') IS NOT NULL
DROP TABLE TBL_COMP_ASSESSMENT

有没有办法在Oracle中实现这一目标?

3 个答案:

答案 0 :(得分:5)

您可以使用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

答案 1 :(得分:5)

动态 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>

答案 2 :(得分:1)

您可以使用

进行检查
  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;