触发器最强大的功能可能是能够将 SPL 例程作为触发操作进行调用,调用 SPL 例程的
EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句允许您将数据从触发表传递至
SPL 例程,还允许您使用由 SPL 例程返回的数据更新触发表。SPL 还允许您定义变量、
对其指定数据、进行比较以及使用过程语句来完成触发操作内的复杂任务。
将数据传至 SPL 例程
可以在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句的参数列表中将数据传
递至 SPL 例程。以下示例中的 EXECUTE PROCEDURE 语句将值从 items 表
的 quantity 和 total_price 列传递至 SPL 例程 calc_totpr:
CREATE TRIGGER upd_totpr
UPDATE OF quantity ON items
REFERENCING OLD AS pre_upd NEW AS post_upd
FOR EACH ROW(EXECUTE PROCEDURE calc_totpr(pre_upd.quantity,
post_upd.quantity, pre_upd.total_price) INTO total_price);
将数据传递至 SPL 例程允许您在该例程执行的操作中使用数据值。
使用 SPL
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 337 -
在之前触发列中的 EXECUTE PROCEDURE 语句调用以下示例所示的 SPL 例程。在更
新 items 表中的 quantity 时,
该过程使用 SPL 计算需要对total_price 列作出的更改。
该过程
接收 quantity 的旧值和新值以及 total_price 的旧值。它用旧的总价除以旧的数值来得出单
价。然后用新的数量乘以单价来得出新的总价。
CREATE PROCEDURE calc_totpr(old_qty SMALLINT, new_qty SMALLINT,
total MONEY(8)) RETURNING MONEY(8);
DEFINE u_price LIKE items.total_price;
DEFINE n_total LIKE items.total_price;
LET u_price = total / old_qty;
LET n_total = new_qty * u_price;
RETURN n_total;
END PROCEDURE;
在本示例中,SPL 允许触发器派生不能直接从触发表获得的数据。
用 SPL 例程中的数据更新非触发列
在触发操作内,
EXECUTE PROCEDURE 语句的 INTO 子句允许您更新触发表中的非触发
列。下例中的 EXECUTE PROCEDURE 语句调用包含 INTO 子句(该子句引
用 total_price 列)的 calc_totpr SPL 过程:
FOR EACH ROW(EXECUTE PROCEDURE calc_totpr(pre_upd.quantity,
post_upd.quantity, pre_upd.total_price) INTO total_price);
更新到 total_price 中的值是 SPL 过程结束时由 RETURN 语句返回的。
对触发语句作用的
每一行更新 total_price 列。