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 过程中最外部的复合语句声明为原子的。如果在执行包含原始复合语句的语句时发生任何错误,那么整个复合语句会回滚。