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