2

场景: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;

我不想创建一个局部变量或常量,它是用另一个常量的值设置的。我不想创建公共同义词。

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

4

2 回答 2

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

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

于 2012-08-28T15:48:36.253 回答
0

ASYNONYM是一个 SQL 构造,因此,不,您不能SYNONYM在 PL/SQL 中声明 a 具有包范围。

与您拒绝的选项(例如 A 中的包变量引用 B 中的常量)相比,在包中声明同义词有什么好处?

于 2012-08-28T15:24:48.013 回答