Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 抑制ddl创建脚本中的ORA-00942错误_Oracle_Hibernate_Schemaexport_Ora 00942 - Fatal编程技术网

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

Oracle 抑制ddl创建脚本中的ORA-00942错误,oracle,hibernate,schemaexport,ora-00942,Oracle,Hibernate,Schemaexport,Ora 00942,假设您通过Hibernate SchemaExport等生成ddl来创建所有db表等。您得到的是一个以drop语句开头的脚本。没问题,因为我想要这个。但运行此脚本会在Oracle数据库上产生大量ORA-00942错误 因为如果表还不存在,它们就不是真正的错误,所以我希望我的创建脚本在执行时没有错误,这样就可以很容易地确定哪些(如果有的话)失败了 我有什么选择?我确实希望生成drop语句,因为表可能存在,也可能不存在,但我不希望有一百万ORA-s返回给我,我必须检查(以确定它们是否是实际错误),因

假设您通过Hibernate SchemaExport等生成ddl来创建所有db表等。您得到的是一个以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错误 db。“

理想情况下,我们应该使用源代码控制和配置管理最佳实践正确地维护模式。在这个场景中,我们预先知道运行脚本的模式是否包含这些表。我们不会出错,因为我们不会尝试删除不存在的表

然而,并非总是能够做到这一点。另一种方法是使用两个脚本。第一个脚本只有DROP TABLE语句,前面有一个友好的

PROMPT  It is safe to ignore any ORA-00942 errors in the following statements
第二个脚本包含所有CREATETABLE语句,并以

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;

小心这个。它是核心选项,将删除模式中的每个表

最好Hib能为我们做这件事,但假设不行,我可以在ddl生成后尝试写一些东西来做这件事。不过,我还是希望有一个稍微简单一点的方法(+1表示某些溶液在least@Crusader创建一个Jira问题…并提交一个补丁:)正在考虑它,但考虑到我使用它的目的,它“可能”不值得麻烦。请阅读:您可以在问题的开头说明您的隐含要求和项目复杂程度,这样做的人会告诉您(以及你身后的人)如何正确地设计解决方案不会被误认为是屈尊俯就。或者,学习使用
grep
,特别是
-v
开关。这是一个有效的观点,但却是一个粗鲁的回答(谢天谢地,这已经被编辑过了)不管怎么说,都完全在回答者的控制之下。而且Windows上的grep也不会计算。我希望的“简单”答案似乎不存在,所以这可能不是一个值得解决的问题?