创建和使用 SPL 例程 / 编写语句块 |
图: FOREACH 循环的结构。
FOREACH cursor FOR SELECT column INTO variable FROM table . . . END FOREACH; FOREACH EXECUTE FUNCTION name() INTO variable; END FOREACH;
图: 对 employee 表操作的 FROEACH 循环。
CREATE_PROCEDURE increase_by_pct( pct INTEGER ) DEFINE s INTEGER; FOREACH sal_cursor FOR SELECT salary INTO s FROM employee WHERE salary > 35000 LET s = s + s * ( pct/100 ); UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor; END FOREACH; END PROCEDURE;
将 SELECT 语句放置在游标内,因为它返回表中所有大于 35000 的薪酬。
UPDATE 语句中的 WHERE CURRENT OF 子句仅更新该游标当前定位在其上的行,并在当前行上设置更新游标。更新游标在该行上放置更新锁,以便于其他用户不可更新该行,直到您的更新发生为止。
图: 自动地设置更新游标。
BEGIN WORK; FOREACH sal_cursor FOR SELECT salary INTO s FROM employee WHERE salary > 35000; LET s = s + s * ( pct/100 ); UPDATE employee SET salary = s WHERE CURRENT OF sal_cursor END FOREACH; COMMIT WORK;
对于前图中 FOREACH 循环的每一迭代,需要新锁(如果您使用行级别锁定的话)。在 FOREACH 循环的最后迭代之后,COMMIT WORK 语句释放所有的锁(并将所有更新了的行作为单个事务提交)。
图: 在循环的每一迭代之后提交更新了的行。
CREATE PROCEDURE serial_update(); DEFINE p_col2 INT; DEFINE i INT; LET i = 1; FOREACH cur_su WITH HOLD FOR SELECT col2 INTO p_col2 FROM customer WHERE 1=1 BEGIN WORK; UPDATE customer SET customer_num = p_col2 WHERE CURRENT OF cur_su; COMMIT WORK; LET i = i + 1; END FOREACH; END PROCEDURE;
SPL 例程 serial_update() 提交每一行作为分开的事务。