在 SPL 例程中间接地引用的更改了的表

然而,如果 SPL 例程依赖于仅被间接地引用的表,则在修改那个表之后,数据库服务器不可检测到重新优化该过程的需要。例如,如果 SPL 调用触发器,则可间接地引用表。如果更改由触发器引用的表的模式(但不是由 SPL 例程直接地引用),则在运行它之前,数据库服务器不知道它应重新优化该 SPL 例程。当在已更改了该表之后运行该过程时,可发生错误 -710。

在首次运行每一 SPL 例程时(不是当创建它时),优化它。此行为意味着 SPL 例程可以首次运行成功,但在虚拟相同的环境之下,后来会失败,如果已更改了间接引用了的表的模式的话。SPL 例程的失败还可是间歇的,因为一次执行期间的失败会强制内部的警告,来在下次执行之前重新优化该过程。

您可以两种方法之一来从此错误恢复: 要防止此错误,您可强制重新优化该 SPL 例程。要强制重新优化,请执行下列语句:
UPDATE STATISTICS FOR PROCEDURE routine;
您可以下列方式之一将此语句添加到您的程序: 为了提高效率,您可将 UPDATE STATISTICS 语句与在程序中较少发生的行动(对象模式或过程的执行的更改)放在一起。在大多数情况下,在程序中较少发生的行为是对象模式的更改。

当您遵循此方法从此错误恢复时,必须为间接引用更改了的表的每一过程执行 UPDATE STATISTICS,除非该过程也显式地引用了这些表。

在只是简单地通过重新执行 SPL 例程来修改被间接地引用了的表之后,您也可从错误 -710 恢复。存储了的过程首次失败时,数据库服务器将该过程标记为需要重新优化。您下一次运行该过程时,数据库服务器在运行该过程之前优化它。然而,运行 SPL 例程两次可能既不实际也不安全。较为安全的选择是使用 UPDATE STATISTICS 语句来强制该过程的重新优化。