我有一个sql脚本文件,我用它来安装表、触发器、序列,最后是一个包。该包使用由sql脚本文件创建的表。包被指定为在应用程序中发生事件时运行,即包在应用程序触发器被触发时运行。
包所做的全部工作就是在临时表中执行批量select insert。这就是它所做的一切。
现在,问题是当我第一次执行全新安装时,包被触发并运行,但没有将数据插入到临时表中。但是,当下一个事件发生时,将触发包,并将数据插入到临时稳定中,并继续正常运行。所以一开始我认为这可能是一个初始化错误。
但是,当我删除sql脚本文件创建的所有对象(包括包)并重新运行sql脚本文件时,包在第一个事件本身发生时工作正常,并继续正常工作。
所以这不可能是一个初始化错误。
但又一次(就因为我失去理智了)我丢弃了所有东西并重新运行脚本文件,我发现了我第一次注意到的相同行为。然后我再次放下所有东西,重新运行脚本文件,它第一次运行得很好。
我不知道为什么它交替工作,这太奇怪了。
发布于 2012-09-09 09:58:18
我猜代码处于无效(未编译)状态。在表上创建触发器,该触发器调用尚未创建的包。然后创建包。第一次运行后,服务器会自动重新编译触发器代码。在创建脚本中,在创建所有对象之后,运行脚本来编译无效对象(ALTER <object> COMPILE
)。
通过检查以下各项,验证情况是否属实:
SELECT object_type, object_name
FROM all_objects
WHERE status = 'INVALID'
在创建之后,但在事件触发之前。
https://stackoverflow.com/questions/12335913
复制相似问题