18

PL/SQL でセッション変数を宣言するにはどうすればよいですか? データベース自体に格納する必要がなく、セッションの間だけ持続する変数です。

4

3 に答える 3

15

「ユーザー作成コンテキスト」を使用して、セッション内の複数のユニットで共有されるデータを保存できます。

まず、コンテキストを作成します。

CREATE CONTEXT SYS_CONTEXT ('userenv', 'current_schema')|| '_ctx' USING PKG_COMMON

次に、コンテキストを管理するパッケージを作成します。

CREATE OR REPLACE PACKAGE PKG_COMMON
IS
   common_ctx_name   CONSTANT VARCHAR2 (60)
                 := SYS_CONTEXT ('userenv', 'current_schema')
                    || '_ctx';

   FUNCTION fcn_get_context_name RETURN VARCHAR2;
   PROCEDURE prc_set_context_value (var_name VARCHAR2, var_value NUMBER);
END;

CREATE OR REPLACE PACKAGE BODY PKG_COMMON
IS
   FUNCTION fcn_get_context_name
      RETURN VARCHAR2
   IS
   BEGIN
      RETURN common_ctx_name;
   END;

   PROCEDURE prc_set_context_value (var_name VARCHAR2, var_value NUMBER)
   IS
   BEGIN
      DBMS_SESSION.set_context (common_ctx_name, var_name, var_value);
   END;
END;

prc_set_context_value はより高度なものにすることができますが、これは単なる例です。作成されたコンテキストとパッケージがあれば、それらを使い始めることができます。プロシージャ コールを使用してコンテキスト変数を設定する

begin
  PKG_COMMON.prc_set_context_value('MyVariable', 9000)
end;

プロシージャ、パッケージ、関数、イベント、ビューなど、どこでも使用できます。

CREATE VIEW V_TEST AS
  SELECT ID, LOGIN, NAME 
    FROM USERS 
   WHERE ROLE_ID =  SYS_CONTEXT(PKG_COMMON.FCN_GET_CONTEXT_NAME, 'MyVariable')

詳細については、http://www.psoug.org/reference/sys_context.htmlを参照してください。

于 2008-11-19T18:08:10.250 に答える
14

パッケージ レベルの変数を作成します。これは最小限の例です:

CREATE OR REPLACE PACKAGE my_package
AS
    FUNCTION get_a RETURN NUMBER;
END my_package;
/

CREATE OR REPLACE PACKAGE BODY my_package
AS
    a  NUMBER(20);

    FUNCTION get_a
    RETURN NUMBER
    IS
    BEGIN
      RETURN a;
    END get_a;
END my_package;
/

これを行う場合は、ORA-04068エラーを読み上げる (そして正しく処理する) 必要があります。各データベース セッションには、独自の値があります。これを試すことができます:

SELECT my_package.get_a FROM DUAL;
于 2008-11-19T09:51:30.080 に答える