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

san*_*osh 1 ddl oracle11g database-schema

我正在尝试使用我生成的架构文件通过我的 Java 应用程序创建数据库。在模式中,我也包含了 drop 查询。但我想对 DROP QUERY 做一些改进。所以我想在运行 drop 查询之前检查 db 对象的存在,并且只有当它存在时才删除。我用谷歌搜索并找到了一些 oracle 链接,一些链接建议遵循以下语法,有些提到ORACLE 不支持这种语法

 SYNTAX A: 
IF EXISTS DROP TABLE TABLE_NAME

SYNTAX B:
DROP [TEMPORARY] TABLE [IF EXISTS]
        tbl_name [, tbl_name] ...
        [RESTRICT | CASCADE]
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下查询:-

IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB'  )
DROP TABLE [BBB]
Run Code Online (Sandbox Code Playgroud)

但它给出了错误:-

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
Run Code Online (Sandbox Code Playgroud)

我参考了以下链接:- https://community.oracle.com/thread/2421779?tstart=0

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

小智 5

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

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE my_table';
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END;
Run Code Online (Sandbox Code Playgroud)

或者您可以在 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;
Run Code Online (Sandbox Code Playgroud)