在 PL 编程中,如果在变量的定义上没有做到统一,可能会隐藏一些危险的错误,这些错误主要是变量的作用范围导致的。与其他高级语言类似,OceanBase 数据库的 PL 的变量作用范围如下:

    • 声明变量的作用范围在所引用的程序单元(块、子程序、包)内,即从声明变量开始到该块的结束。

    • 一个变量(标识)只在所引用的块内是可见的。

    • 当一个变量超出了作用范围,PL 引擎就释放用来存放该变量的空间。

    • 在子块中重新定义该变量后,它的作用仅在该子块内。

    示例:子块定义的变量优先级高于父块定义的变量,且相互不影响

    1. obclient> DECLARE
    2. -> V_my_name varchar(10) := 'OceanBase';
    3. -> BEGIN
    4. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    5. -> DECLARE
    6. -> V_my_name varchar(30) := 'OceanBase rocks';
    7. -> BEGIN
    8. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    9. -> END;
    10. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    11. -> END;
    12. -> /
    13. Query OK, 0 rows affected (0.03 sec)
    14. OceanBase
    15. OceanBase rocks
    16. OceanBase

    示例:子块中定义的变量对父块不可见

    1. obclient> DECLARE
    2. -> V_my_name varchar(10) := 'OceanBase';
    3. -> BEGIN
    4. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    5. -> DECLARE
    6. -> V_my_name varchar(30) := 'OceanBase rocks';
    7. -> V_in_var varchar(30) := 'I am inside';
    8. -> BEGIN
    9. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    10. -> END;
    11. -> DBMS_OUTPUT.PUT_LINE(V_my_name);
    12. -> DBMS_OUTPUT.PUT_LINE(V_in_var);
    13. -> END;
    14. -> /
    15. ORA-00600: internal error code, arguments: -5543, Undeclared variable: V_IN_VAR