引用 SPL 变量和异常处理程序的作用域

BEGIN 和 END 关键字可以限制 SPL 变量和异常处理程序的作用域。在 BEGIN 和 END 语句块中的变量声明和异常处理程序定义是语句块局部的,在语句块外面不可见。下面的代码使用了 BEGIN 和 END 语句块来限定变量引用的作用域:
CREATE DATABASE demo;
        CREATE TABLE tracker (
        who_submitted CHAR(80), -- Show what code was running.
        value INT,              -- Show value of the variable.
        sequential_order SERIAL -- Show order of statement execution.
        );
        CREATE PROCEDURE demo_local_var()
        DEFINE var1, var2 INT;
        LET var1 = 1;
        LET var2 = 2;
        INSERT INTO tracker (who_submitted, value) 
        VALUES ('var1 param before sub-block', var1);
        BEGIN
        DEFINE var1 INT;   -- same name as global parameter.
        LET var1 = var2;
        INSERT INTO tracker (who_submitted, value) 
        VALUES ('var1 var defined inside the "IF/BEGIN".', var1);
        END
        INSERT INTO tracker (who_submitted, value) 
        VALUES ('var1 param after sub-block (unchanged!)', var1);
        END PROCEDURE;
        EXECUTE PROCEDURE demo_local_var();
        SELECT sequential_order, who_submitted, value FROM tracker 
        ORDER BY sequential_order;

这个示例声明了三个变量,其中两个名为 var1。(这里创建的名称冲突是为了说明哪种变量是可见的。通常建议对不同变量不要使用相同的名称。因为冲突的变量名会造成代码可读性差并且难维护。)

因为语句块的关系,每次只有一个 var1 变量在作用域中。

在语句块中声明的 var1 变量是唯一可以在语句块中引用的 var1 变量。

在语句块外面声明的 var1 变量在语句块中是不可见的。因为它在作用域之外,所以发生在语句块内部的 var1 变量值的更改对它没有影响。所有语句运行以后,外面的 var1 的值仍然是 1

var2 变量在语句块中可见,因为它没有因名称冲突而被块专用变量替代。