【问题标题】:How can drop table if table exists in oracle?如果oracle中存在表,如何删除表?
【发布时间】:2016-02-16 05:16:08
【问题描述】:

我正在尝试通过我的 java 应用程序使用我生成的模式文件创建数据库。在架构中,我也包含了删除查询。但我想对 DROP QUERY 做一些改进。所以我想在运行删除查询之前检查数据库对象的存在,并且只有在它存在时才删除。 我用谷歌搜索它并找到了一些 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

如果有任何其他查询可以在表存在的情况下删除表,请建议我。

【问题讨论】:

标签: oracle11g database-schema ddl


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 上面提到的块将只删除表,我想删除数据库的所有对象。
    • 如果要删除所有对象,则应从 DBA_OBJECTS 中选择。 Oracle DB 可以存储许多对象类型(表、分区、类型、包、过程、函数、同义词、物化视图、DBLink、目录和许多其他对象)每种对象类型都有自己的“删除”语句(DROP TABLE、DROP SYSNSNYM ,删除目录等)。也许这个任务的最佳解决方案是删除用户并重新创建它(这将删除所有用户的对象)。
    • Oracle 没有 MySQL 的“...IF EXISTS”这样的语句
    【解决方案3】:

    试试这个:如果表 '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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2012-06-06
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多