支持函数命名空间访问局部变量

PolarDB PostgreSQL版(兼容Oracle)支持通过函数命名空间直接访问函数中声明的局部变量。您可以在局部变量前显式加上当前函数的名称,以明确区分并访问该局部变量。

前提条件

支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:

Oracle语法兼容 2.0(内核小版本2.0.14.17.33.0及以上)

说明

您可在控制台查看内核小版本号,也可以通过SHOW polardb_version;语句查看。如未满足内核小版本要求,请升级内核小版本

注意事项

  • 仅支持访问当前函数内的局部变量:通过<function_name>.<variable_name>访问的变量必须是函数本地声明的局部变量,不能访问其他函数的局部变量。

  • 避免变量冲突:当局部变量名称与外部变量(如全局变量或包变量)存在同名冲突时,可通过命名空间显式区分。

  • 保持代码简洁:在无冲突的情况下,仍建议直接使用局部变量名,以减少代码复杂度。

示例

以下示例为您展示如何通过函数命名空间访问局部变量,并区分同名的包级变量:

CREATE OR REPLACE PACKAGE p AS
    m INTEGER := 200; -- 包级全局变量
END p;

DECLARE
    PROCEDURE p(v IN VARCHAR2) IS
        m INTEGER := 100; -- 子过程内局部变量
    BEGIN
        -- 使用子过程命名空间访问局部变量
        dbms_output.put_line(p.m); -- 输出 100
    END;
BEGIN
    -- 调用子过程
    p('abcd');
END;

该语句中:

  • 在包p中定义了一个全局变量m,其值为200

  • 在匿名块中定义了一个局部过程p,其内部声明了一个局部变量m,值为100

  • 在过程p内,通过p.m 访问局部变量m

此时p.m明确表示的是局部变量m,而非包中的全局变量p.m。执行以上语句返回结果如下:

100

通过函数命名空间访问的变量为局部变量,而非包中的全局变量。这一机制为命名空间管理和变量冲突问题提供了更为优雅的解决方案,提升了代码的可读性,同时灵活地控制了变量的访问范围。