2

シナリオ: package_apublic 定数を参照する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

Aは SQL コンストラクトであるため、 PL/SQL でパッケージ スコープを使用してSYNONYMa を宣言することはできません。SYNONYM

B の定数を参照する A のパッケージ変数など、拒否するオプションよりも、パッケージでシノニムを宣言する利点は何ですか?

于 2012-08-28T15:24:48.013 に答える