SPL 例程的规则

除了触发器的再进入中列出的规则外,以下规则适用于指定为触发操作的 SPL 例程:
  • 在只希望有一行的上下文中,SPL 例程不能是游标函数(返回多行的函数)。
  • 在 SPL 例程中不能使用旧的或新的相关性名称,除非 CREATE FUNCTION 或 CREATE PROCEDURE 语句包含了将 UDR 定义为触发例程的 REFERENCING 子句。如果您需要在例程中使用相应的值,则必须将它们传递为参数。例程应答独立于触发器,且旧的或新的相关性名称在触发器外不具有任何意义。
  • 触发器例程必须包含可以为触发器例程中 SPL 语句可以引用的 OLD 或 NEW 列值声明相关名称的 REFERENCING 子句。
  • 触发例程必须包含指定本地数据库中的表或视图的名称的 FOR table_object 子句,其触发器可以调用此例程。该触发操作不能调用没有指定触发表或视图的触发器例程。
  • 只有在 Triggered Action 列表的 FOR EACH ROW 部分中调用的触发器例程才能直接操作在触发器的或触发器例程的 REFERENCING 子句中定义的旧的或新的相关名称。
  • 触发器例程只能在触发器定义中 Triggered Action 列表的 FOR EACH ROW 部分调用。
  • OLD 或 NEW 值的相关变量可以出现在 SPL 的 IF 语句和 CASE 表达式中。
  • 只有 NEW 值的相关变量可以在引用相关变量的 LET 表达式的左边。在这种情况中,SPL 例程的 FOR 子句必须指定表(而非视图),并且调用 SPL 例程的操作的触发器不能是 INSTEAD OF 触发器。
  • OLD 和 NEW 值可以在 LET 表达式的右边。
  • 只用 FOR EACH ROW 子句中调用的触发器例程可以使用 Boolean 运算符SELECTING 、INSERTING 、DELETING 和 UPDATING。如果触发事件符合由相同名称的运算符引用的 DM 操作,则返回 TRUE('t'),否则返回 FALSE('f')。
  • SPL 的 IF 语句和 SQL 的 CASE 表达式可以指定这些运算符为触发例程中的条件。
  • 触发器例程必须用 SPL 语句编写。它们不能使用外部语言编写,例如 C 或 Java™ 语言,但是触发器例程可以包含外部语言的调用,例如用于触发器内省的 mi_trigger 应用程序接口。
  • 触发器例程不能引用保存点。触发操作对数据值或数据库结构的更改必须整体提交或回滚。 GBase 8s 在触发器例程中不支持 ROLLBACK TO SAVEPOINT 语句用于触发操作的部分回滚。

有关 mi_trigger API 的更多信息,请参阅 GBase 8s DataBlade API 程序员指南GBase 8s DataBlade API 函数参考

当您使用 SPL 例程作为触发操作时,除非执行该例程,否则例程引用的数据库对象不被检查。

另请参阅 触发器和 SPL 例程 中的 SPL 限制。