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

Oracle11g 如果oracle中存在表,如何删除表?,oracle11g,database-schema,ddl,Oracle11g,Database Schema,Ddl,我正试图通过java应用程序使用生成的模式文件创建数据库。在模式中,我还包括了drop查询。但是我想对DROP查询做一些改进。因此,我想在运行drop查询之前检查db对象的存在性,并且仅当db对象存在时才进行drop。 我在谷歌上搜索了一下,发现了一些oracle链接,一些链接建议使用以下语法,还有一些提到了这一点 我还尝试了以下查询:- IF EXISTS (SELECT * FROM dba_objects WHERE OBJECT_NAME = 'BBB' ) DROP TABLE [B

我正试图通过java应用程序使用生成的模式文件创建数据库。在模式中,我还包括了drop查询。但是我想对DROP查询做一些改进。因此,我想在运行drop查询之前检查db对象的存在性,并且仅当db对象存在时才进行drop。 我在谷歌上搜索了一下,发现了一些oracle链接,一些链接建议使用以下语法,还有一些提到了这一点

我还尝试了以下查询:-

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
我参考了以下链接:-


如果表格存在,请建议我是否有任何其他查询需要删除带有条件的表格。删除表格时不进行检查。如果存在任何错误,你永远不会知道什么时候出了问题

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;

不用支票就把桌子放下。如果存在任何错误,你永远不会知道什么时候出了问题

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;

若您运行以下代码,则不必检查表是否存在以及是否存在错误(表已用now wait或您将知道的任何其他命令锁定)


若您运行以下代码,则不必检查表是否存在以及是否存在错误(表已用now wait或您将知道的任何其他命令锁定)

尝试以下操作:如果表“table_name”存在,它将删除该表。 尝试以下操作:如果表“table_name”存在,它将删除该表。
上述块的可能重复将只删除表,我希望删除数据库的所有对象。如果要删除所有对象,则应从DBA_对象中选择。Oracle DB可以存储许多对象类型(表、分区、类型、包、过程、函数、同义词、物化视图、数据库链接、目录和许多其他对象),每个对象类型都有自己的“drop”语句(drop TABLE、drop SYSNSYM、drop DIRECTORY等)。也许这个任务的最佳解决方案是删除用户并重新创建它(这将删除所有用户的对象)。Oracle没有“如果存在”这样的语句,因为MySQL上面提到的块将只删除表,我希望删除数据库的所有对象。如果要删除所有对象,那么应该从DBA_对象中选择。Oracle DB可以存储许多对象类型(表、分区、类型、包、过程、函数、同义词、物化视图、数据库链接、目录和许多其他对象),每个对象类型都有自己的“drop”语句(drop TABLE、drop SYSNSYM、drop DIRECTORY等)。也许这个任务的最佳解决方案是删除用户并重新创建它(这将删除所有用户的对象)
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;