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

Oracle 有没有办法在包范围内为另一个包中的常量创建本地化同义词?,oracle,oracle11g,Oracle,Oracle11g,场景:package\u a引用了package\u 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 p

场景:
package\u a
引用了
package\u 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;
我想这样做:

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;
我不想创建一个局部变量或常数,该变量或常数由另一个常数的值设置。 我不想创建公共同义词


我希望它在包的私有作用域中。

A
同义词
是一个SQL构造,因此,不,您不能用包作用域在PL/SQL中声明一个
同义词


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

a
同义词
是SQL构造,因此,不,您不能在PL/SQL中使用包范围声明同义词


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

如果您真的需要它-我不知道它有什么好处,也许除了一个较短的名称-您可以使用私有函数来获得类似的效果:

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

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

如果您真的需要它,我不知道它有什么好处,除了一个较短的名称,您可以使用私有函数来获得类似的效果:

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

因为函数只在包体中声明,所以它是包的私有函数,我认为它满足您的范围要求。

将“同义词”放在引号中。我想做一些事情,比如创建一个同义词,但是在包私有范围内。目的:代码的清洁度。@scraphythenell-在一个范围相同的包变量上,类似同义词的构造有什么清洁度优势,该变量被分配包B的常量值?你可以按照Alex Poole的建议使用私有函数,但我不清楚这是否符合你的标准。我不确定在私有变量或私有函数上类似同义词的构造是否有清洁的好处。它在定义上会更干净,并有助于防止其他开发人员更新某个位置的值,但不会更新原始位置的值。它还意味着一个更干净的内存空间,因为它仍然指向原始值。我想做一些事情,比如创建一个同义词,但是在包私有范围内。目的:代码的清洁度。@scraphythenell-在一个范围相同的包变量上,类似同义词的构造有什么清洁度优势,该变量被分配包B的常量值?你可以按照Alex Poole的建议使用私有函数,但我不清楚这是否符合你的标准。我不确定在私有变量或私有函数上类似同义词的构造是否有清洁的好处。它在定义上会更干净,并有助于防止其他开发人员更新某个位置的值,但不会更新原始位置的值。这也意味着更干净的内存空间,因为它仍将指向原始值。这肯定会起作用,但我不希望调用函数的开销。尽管我同意这样做会起作用,并保持代码的整洁。不过,为了绕过函数调用,我可以添加一个编译器提示:PRAGMA INLINE(全局_常量“YES”);这肯定会起作用,但我不想要调用函数的开销。尽管我同意这样做会起作用,并保持代码的整洁。不过,为了绕过函数调用,我可以添加一个编译器提示:PRAGMA INLINE(全局_常量“YES”);能够为这样的东西生成本地别名将是对PL/SQL语言的一个很好的补充,IMO。能够为这样的东西生成本地别名将是对PL/SQL语言的一个很好的补充。