2008-11-19 90 views

回答

11

您創建一個包級別變量。這是一個小例子:

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; 
11

您可以使用「用戶創建的上下文」來存儲跨會話中多個單元共享的數據。

首先,創建上下文:

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

+0

當我創建上下文,它說:ORA-28265:名稱空間以 'SYS_' 是不允許的。 我試圖將其設置爲變量。但它設置變量名稱而不是值 – 2016-11-26 05:09:22