0

我有一个 sql 脚本文件,用于安装表、触发器、序列,最后是一个包。该包使用由 sql 脚本文件创建的表。程序包被指定在应用程序中发生事件时运行,即程序包在应用程序触发器被触发时运行。

该软件包所做的只是将批量选择插入到临时表中。这就是它所做的一切。

现在,问题是当我第一次进行全新安装时,程序包被触发并运行,但不会将数据插入临时表。但是,当下一个事件发生时,会触发包并将数据插入到暂存稳定器中并继续正常运行。所以最初我认为这可能是一个初始化错误。

但是,当我删除由 sql 脚本文件(包括包)创建的所有对象并重新运行 sql 脚本文件时,当第一个事件本身发生并继续正常运行时,包工作得很好。

所以这不可能是初始化错误。

但是再一次(只是因为我失去了理智)我放弃了所有内容并重新运行脚本文件,我发现我第一次注意到的行为相同。然后我再次删除所有内容并重新运行脚本文件,它第一次工作得很好。

我不知道为什么它会交替工作,这太奇怪了。

4

1 回答 1

3

我猜代码处于无效(未编译)状态。在调用尚未创建的包的表上创建触发器。然后创建包。首次运行后,触发代码由服务器自动重新编译。在您的创建脚本中,创建所有对象后,运行一个脚本来编译无效对象 ( ALTER <object> COMPILE)。

通过检查来验证是否是这种情况:

SELECT object_type, object_name
  FROM all_objects
  WHERE status = 'INVALID'

在创建之后,但在您的事件触发之前。

于 2012-09-09T01:58:17.777 回答