在 PL 编程中,如果在变量的定义上没有做到统一,可能会隐藏一些危险的错误,这些错误主要是变量的作用范围导致的。与其他高级语言类似,OceanBase 数据库的 PL 的变量作用范围如下:
声明变量的作用范围在所引用的程序单元(块、子程序、包)内,即从声明变量开始到该块的结束。
一个变量(标识)只在所引用的块内是可见的。
当一个变量超出了作用范围,PL 引擎就释放用来存放该变量的空间。
在子块中重新定义该变量后,它的作用仅在该子块内。
示例:子块定义的变量优先级高于父块定义的变量,且相互不影响
obclient> DECLARE
-> V_my_name varchar(10) := 'OceanBase';
-> BEGIN
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> DECLARE
-> V_my_name varchar(30) := 'OceanBase rocks';
-> BEGIN
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> END;
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> END;
-> /
Query OK, 0 rows affected (0.03 sec)
OceanBase
OceanBase rocks
OceanBase
示例:子块中定义的变量对父块不可见
obclient> DECLARE
-> V_my_name varchar(10) := 'OceanBase';
-> BEGIN
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> DECLARE
-> V_my_name varchar(30) := 'OceanBase rocks';
-> V_in_var varchar(30) := 'I am inside';
-> BEGIN
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> END;
-> DBMS_OUTPUT.PUT_LINE(V_my_name);
-> DBMS_OUTPUT.PUT_LINE(V_in_var);
-> END;
-> /
ORA-00600: internal error code, arguments: -5543, Undeclared variable: V_IN_VAR