例如,假设以下 UPDATE 语句,更新 tab1 的列 a 和 b ,是触发语句:
UPDATE tab1 SET (a, b) = (a + 1, b + 1);
现在考虑以下示例中的触发操作。第一个 UPDATE 语句可以是有效的触发操作,但是第二个不是,因为它再次更新 b 列。
UPDATE tab1 SET c = c + 1; -- OK UPDATE tab1 SET b = b + 1; -- INVALID
当 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句是触发操作时 UPDATE 触发器的 INTO 子句仅在 FOR EACH ROW 触发操作中有效,并且出现在 INTO 子句中的列名必须来自触发表。
以下语句说明了 INTO 子句的正确用法: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);INTO 关键字之后的列必须在触发列表中,但是不需要被触发事件更新。
当 INTO 子句出现在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句中时,当从 UDR 返回值时,数据库服务器立即用该值更新指定的列。
如果触发器具有 INSERT 事件,并且触发器操作更新触发表,则两个语句中的列必须互斥。例如,假设触发语句为表 tab1 的列 cola 和 colb 插入值:
INSERT INTO tab1 (cola, colb) VALUES (1,10);
现在考虑以下触发操作。第一个 UPDATE 是有效的,但是第二个无效。因为即使触发事件已经为列 colb 提供了值,它仍然更新列 colb :
UPDATE tab1 SET colc=100; --OK UPDATE tab1 SET colb=100; --INVALID
当 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句是触发操作时,仅当触发操作出现在 FOR EACH ROW 列表中时,您可以为 INSERT 触发器指定 INTO 子句。在此情况中,INTO 子句只能包含来自触发表的列名称。
以下语句说明了 INTO 子句的有效用法:CREATE TRIGGER ins_totpr INSERT ON items REFERENCING NEW AS new_ins FOR EACH ROW (EXECUTE PROCEDURE calc_totpr (0, new_ins.quantity, 0) INTO total_price);
INTO 关键字之后的列可以是触发事件提供的触发列表中的列,或是触发事件未提供的触发表中的事件。
当 INTO 子句出现在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句中时,数据库夫服务器立即用从 UDR 返回的值更新指定的列。