如果表存在于oracle中,如何删除表?

时间:2016-02-16 05:16:09

标签: oracle11g database-schema ddl

我正在尝试使用我生成的模式文件通过我的java应用程序创建数据库。在模式中,我还包括了drop查询。但我想对DROP QUERY做一些改进。所以我想在运行drop查询之前检查db对象是否存在,并且只在它存在时才删除。 我用Google搜索并发现了一些oracle链接,有些链接建议遵循语法,有些提到ORACLE does not support such syntax

 SYNTAX A: 
IF EXISTS DROP TABLE TABLE_NAME

SYNTAX B:
DROP [TEMPORARY] TABLE [IF EXISTS]
        tbl_name [, tbl_name] ...
        [RESTRICT | CASCADE]

我也尝试过以下查询: -

IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB'  )
DROP TABLE [BBB]

但它给出了错误: -

Error starting at line 2 in command:
DROP TABLE [BBB]
Go
Error report:
SQL Error: ORA-00903: invalid table name
00903. 00000 -  "invalid table name"
*Cause:    
*Action:

Error starting at line 1 in command:
IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB'  ) DROP TABLE [BBB]
Error report:
Unknown Command

我提到以下链接: - https://community.oracle.com/thread/2421779?tstart=0

如果表存在,请建议我是否有任何其他查询要删除有条件的表。

3 个答案:

答案 0 :(得分:4)

删除表而不检查。如果存在任何错误,您将永远不知道什么时候出错了。

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE my_table';
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;

或者您可以在Oracle词典中搜索。

DECLARE
  l_cnt  NUMBER;
BEGIN  
  SELECT count(*)
    INTO l_cnt
    FROM user_tables
   WHERE table_name = 'MY_TABLE';
  IF l_cnt = 1 THEN
      EXECUTE IMMEDIATE 'DROP TABLE my_table';
  END IF;
END;

答案 1 :(得分:1)

如果您运行以下代码,则不必检查表是否存在以及是否存在错误(表已锁定,现在等待或您将了解其他任何其他代码)

begin
    for c1 in (select owner,table_name from dba_tables where table_name='MY_TABLE') loop
        execute immediate 'drop table '||c1.owner||'.'||c1.table_name||'';
    end loop;
end;

答案 2 :(得分:0)

试试这个:如果表'table_name'存在,它将删除它。

declare
 a varchar2(700) ;
begin
   execute immediate '  SELECT CASE WHEN  tab = 1
                                    THEN  ''DROP TABLE TABLE_NAME''
                                    ELSE  ''select 1 from dual''
                                END
                         FROM (  SELECT sum(case when table_name = ''TABLE_NAME'' then 1 else 0 end ) as tab  FROM user_tables)' into a;
   EXECUTE IMMEDIATE a;
end;