2011-06-22 26 views
2

我正在写一些批处理脚本为我的公司,我在一些历史批处理脚本看到以下步骤:Oracle SQL - DML语句是否会导致对象无效?

  1. 有一个Delete from table where ....声明
  2. Oracle导入工具用于导入单个记录
  3. 重新编译架构

我不相信你将需要删除,然后导入(插入)后重新编译架构。我错了吗?是否有可能DDL语句(如删除和插入)可能导致对象无效?

回答

1

我假设你在导入时指定了TABLES参数?如果是这样,你处于TABLE模式,这意味着程序对象,视图等不会被导入。 imp命令对任何可能由进程导入的PL/SQL程序单元执行COMPILE。这可能会导致其他依赖对象失效,因此批处理脚本中会重新编译。当然,很多时候这种事情都是基于另一个用作模板的脚本放入脚本中的,而且很容易就不必要了。

+0

是的,tables参数是用where子句定义的。从字面上看,删除一行然后重新添加它。 (它必须使用IMPORT,因为该行包含BLOB)。 – contactmatt

+0

然后你不需要重新编译数据库对象。您当然可以通过省略重新编译步骤并在导入后检查无效对象来验证。 – DCookie

1

想不出理由,为什么会发生这种事,除非你的DML与数据字典,这听起来像一个非常糟糕的主意......搞乱

作为又一想,也许是重新编译有做需要的COMMIT的副作用?

+0

从非系统表中删除只有一条删除语句。另一个DML语句来自Oracle导入实用程序(我假设执行插入操作) – contactmatt

+1

触发器是不太可能的可能性。可能与条件编译有关,但似乎极端 –