SQL 过程中的复合语句和变量范围
可使用复合语句来引入新作用域,在该作用域中,变量可能可用,也可能不可用。
SQL 过程可包含一个或多个编译型复合语句。可按顺序引入这些语句,也可将它们嵌套在另一复合语句内。
使用标签来标识复合语句很重要,因为标签可用来限定和唯一标识复合语句内声明的变量。引用不同复合语句或嵌套复合语句中的变量时,这一点特别重要。
在以下示例中,变量 a 有两个声明。其中一个实例在 lab1 标记的外部复合语句中声明,第二个实例在 lab2 标记的内部复合语句中声明。Db2® 将假定赋值语句中引用的 a 是指 lab2 所标记的复合块局部作用域中的对象。但是,如果变量 a 的期望实例是使用 lab1 标记的复合语句块中声明的对象,那么为了在最内部的复合块中正确地引用该对象,必须使用该块的标记来限定该变量。即,它应该限定为 lab1.a。
CREATE PROCEDURE P1 ()
LANGUAGE SQL
lab1: BEGIN
DECLARE a INT DEFAULT 100;
lab2: BEGIN
DECLARE a INT DEFAULT NULL;
SET a = a + lab1.a;
UPDATE T1
SET T1.b = 5
WHERE T1.b = a; <-- Variable a refers to lab2.a
unless qualified otherwise
END lab2;
END lab1
可通过在 BEGIN 关键字后添加关键字 ATOMIC 将 SQL 过程中最外部的复合语句声明为原子的。如果在执行包含原始复合语句的语句时发生任何错误,那么整个复合语句会回滚。