在ddl创建脚本中抑制ORA-00942错误

假设您生成ddl以通过Hibernate SchemaExport等创建所有数据库表等。您得到的是一个以开头的drop语句开头的脚本。不是问题,因为我想要这个。但是运行此脚本会在Oracle数据库上运行一堆ORA-00942错误。 因为如果表还不存在它们并不是真正的错误,我希望我的创建脚本在执行时没有错误,因此很容易确定哪些(如果有的话)失败了。 我有什么选择?我想要生成drop表达式,因为表格可能存在,也可能不存在,但我不想让一百万ORA-s回到我身边,我必须检查(以确定它们是否是真正的错误),因为它不能放下一张全新的桌子。     
已邀请:
如果你得到一个drop语句的脚本,并且Hibernate不会为你做,那么将DROP TABLE语句包装在IF中以测试表是否存在然后删除它:
IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;
    
  “假设你生成ddl来创建所有   您的数据库表等通过Hibernate   SchemaExport等。你得到的是一个   以drop开头的脚本   一开始的陈述。不是   问题,因为我想要这个。但跑步   这个脚本产生了一个垃圾   在Oracle上运行ORA-00942错误   D b。” 理想情况下,我们应使用源代码管理和配置管理最佳实践来正确维护我们的架构。在这种情况下,我们事先知道我们运行脚本的模式是否包含这些表。我们不会收到错误,因为我们不会尝试删除不存在的表。 但是,并不总是可以这样做。另一种方法是使用两个脚本。第一个脚本只有DROP TABLE语句,前面是友好的
PROMPT  It is safe to ignore any ORA-00942 errors in the following statements
第二个脚本具有所有CREATE TABLE语句并引导
PROMPT  All the statements in this script should succeed.  So investigate any errors
另一种选择是使用数据字典:
begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;
小心这个。它是核选项,将删除模式中的每个表。     

要回复问题请先登录注册