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 变量在语句块中可见,因为它没有因名称冲突而被块专用变量替代。