有没有办法在包范围内为另一个包中的常量创建本地化的同义词?

时间:2012-08-28 15:18:04

标签: oracle oracle11g

场景:package_a引用package_b

中的公共常量

现有代码如下所示:

PACKAGE package_a
IS
   PROCEDURE do_something
   IS
   BEGIN
      ...
      do_something_else(package_b.global_constant);
      ...
   END;
END package_a;

我想做这样的事情:

PACKAGE package_a
IS
   SYNONYM global_constant FOR package_b.global_constant;

   PROCEDURE do_something
   IS
   BEGIN
      ...
      do_something_else(global_constant);
      ...
   END;
END package_a;

我不想创建一个局部变量或常量来设置w /另一个常量的值。 我不想创建一个公共同义词。

我希望它在包私有范围内。

2 个答案:

答案 0 :(得分:4)

如果你真的想要它 - 而且我看不出它有什么好处,除了可能是一个较短的名字 - 你可以使用私人功能来获得类似的效果:

create package package_b is
    global_constant number := 42;
end package_b;
/

create package body package_b is
end package_b;
/

create package package_a is
    procedure do_something;
end package_a;
/

create package body package_a is
    /* private function */
    function global_constant return number is
    begin
        return package_b.global_constant;
    end global_constant;

    /* public procedure */
    procedure do_something is
    begin
        dbms_output.put_line('Constant is: ' || global_constant);
    end do_something;
end package_a;
/

set serveroutput on
exec package_a.do_something;

哪个输出:

Constant is: 42

因为该函数仅在包体中声明,所以它是包的私有,我认为这符合您的范围要求。

答案 1 :(得分:0)

SYNONYM是一个SQL构造,所以不,你不能在包含范围的PL / SQL中声明SYNONYM

声明包中的同义词对于您拒绝的选项有什么好处,例如A中的包变量引用B中的常量?