PL/SQL: How do I declare session variables?

前端 未结 3 539
眼角桃花
眼角桃花 2021-02-04 05:18

How do I declare a session variable in PL/SQL - one that will persist for the duration of the session only, without me having to store it in the database itself?

3条回答
  •  温柔的废话
    2021-02-04 05:27

    You can use a 'user-created context' to store data shared across multiple units within a session.

    First, create a context:

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

    Second, create a package that would manage your context:

    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;
    

    The prc_set_context_value can be more advanced, that's just an example. With the context and the package created you can start using them. Set a context variable using a procedure call

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

    and use it anywhere - any procedure, package, function or event a view.

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

    For more information see http://www.psoug.org/reference/sys_context.html

提交回复
热议问题