PLSQL-安装可以交替工作

PLSQL-安装可以交替工作,plsql,Plsql,我有一个sql脚本文件,用于安装表、触发器、序列,最后是一个包。该包使用sql脚本文件创建的表。程序包被指定在应用程序中发生事件时运行,即程序包在触发应用程序触发器时运行 该包所做的只是将批量选择插入到临时表中。这就是它的全部功能 现在的问题是,当我第一次执行干净安装时,会触发并运行包,但不会将数据插入临时表。但是,当下一个事件发生时,程序包被触发,数据被插入到staging stable中并继续正常工作。所以最初我认为这可能是一个初始化错误 但是,当我删除sql脚本文件创建的所有对象(包括包)

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

该包所做的只是将批量选择插入到临时表中。这就是它的全部功能

现在的问题是,当我第一次执行干净安装时,会触发并运行包,但不会将数据插入临时表。但是,当下一个事件发生时,程序包被触发,数据被插入到staging stable中并继续正常工作。所以最初我认为这可能是一个初始化错误

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

因此,这不可能是初始化错误

但是(仅仅因为我失去了理智)我放弃了一切,重新运行脚本文件,我发现了我第一次注意到的相同行为。然后我再次删除所有内容,然后重新运行脚本文件,第一次就可以正常工作了


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

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

通过检查以下各项,确认情况属实:

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

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

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

通过检查以下各项,确认情况属实:

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

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

实际上,表不调用包。第二件事是,当我运行无效对象的查询时,它重新运行了0行。我尝试使用sleep()甚至将包的安装从脚本文件中移出。但这种行为会重复。我正计划手动安装这个软件,看看是否有相同的行为。@Glenn…它确实是一个基本同义词,在我每次丢弃软件包时都变得无效。将为包创建同义词。谢谢你给我指明了正确的方向。但我认为无效对象在手动编译之前不会自动重新编译。@user547453很高兴您找到了它。可能会令人沮丧地发现。请看一看,引用无效的从属对象时,会自动进行重新编译。命中无效对象时,会尝试重新编译,但命中无效对象的作业仍然失败,因为它是无效的。如果编译成功,那么下一次命中将成功。再往下看一点,看看
utl\u recomp
:在安装脚本之后运行会很有用。实际上,该表不调用该包。第二件事是,当我运行无效对象的查询时,它重新运行了0行。我尝试使用sleep()甚至将包的安装从脚本文件中移出。但这种行为会重复。我正计划手动安装这个软件,看看是否有相同的行为。@Glenn…它确实是一个基本同义词,在我每次丢弃软件包时都变得无效。将为包创建同义词。谢谢你给我指明了正确的方向。但我认为无效对象在手动编译之前不会自动重新编译。@user547453很高兴您找到了它。可能会令人沮丧地发现。请看一看,引用无效的从属对象时,会自动进行重新编译。命中无效对象时,会尝试重新编译,但命中无效对象的作业仍然失败,因为它是无效的。如果编译成功,那么下一次命中将成功。再往下看一点,看看
utl\u recomp
:可以在安装脚本之后运行。