DBMS_SESSION内置包提供了从PL/SQL访问SQL ALTER SESSION
和SET ROLE
语句以及其他会话信息的能力。
DBMS_SESSION子程序总览
子程序 | 说明 |
CLEAR_ALL_CONTEXT Procedure | 清除指定命名空间的全部上下文属性。 |
CLEAR_CONTEXT Procedure | 清除指定命名空间的特定上下文属性。 |
LIST_CONTEXT Procedure | 返回当前会话的活跃命名空间和上下文列表。 |
SET_CONTEXT Procedure | 设置或者重置上下文属性的值。 |
SET_ROLE Procedure | 设置当前上下文的角色。 |
SLEEP Procedure | 将当前的会话暂停指定的时长。 |
CLEAR_ALL_CONTEXT
该存储过程用于清除指定命名空间的全部上下文属性。
语法
DBMS_SESSION.CLEAR_ALL_CONTEXT(
namespace IN VARCHAR2);
参数说明
参数 | 说明 |
namespace | 待清除上下文的命名空间。 |
示例
该示例清除了指定上下文的全部属性值。
EXEC DBMS_SESSION.CLEAR_ALL_CONTEXT('test_ctx');
CLEAR_CONTEXT
该存储过程用于清除指定命名空间的特定上下文属性。
语法
DBMS_SESSION.CLEAR_CONTEXT(
namespace IN VARCHAR2,
client_identifier IN VARCHAR2 DEFAULT NULL,
attribute IN VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
namespace | 待清除上下文的命名空间。 |
client_identifier | (可选参数)兼容性提供参数。默认值为NULL。 |
attribute | (可选参数)命名空间中的具体属性名称。默认值为NULL。 |
示例
该示例展示了如何清除上下文的指定属性值。
CREATE CONTEXT test_ctx USING ctx_pkg;
DECLARE
val VARCHAR2(20);
BEGIN
DBMS_SESSION.SET_CONTEXT('test_ctx', 'a', '1');
val := SYS_CONTEXT('test_ctx', 'a');
DBMS_OUTPUT.PUT_LINE('a of test_ctx is:' || val);
DBMS_SESSION.CLEAR_CONTEXT('test_ctx', NULL, 'a');
val := SYS_CONTEXT('test_ctx', 'a');
IF val IS NULL THEN
DBMS_OUTPUT.PUT_LINE('The a of test_ctx has been cleared');
END IF;
END;
-- a of test_ctx is:1
-- The a of test_ctx has been cleared
LIST_CONTEXT
该存储过程用于返回当前会话的活跃命名空间和上下文列表。
语法
该存储过程使用了自定义类型作为参数,该类型的语法和存储过程的语法如下:
TYPE AppCtxRecTyp IS RECORD (
namespace VARCHAR2(30),
attribute VARCHAR2(30),
value VARCHAR2(256));
TYPE AppCtxTabTyp IS TABLE OF AppCtxRecTyp;
DBMS_SESSION.LIST_CONTEXT (
list OUT AppCtxTabTyp,
size OUT NUMBER);
参数说明
参数 | 说明 |
list | 当前会话中的(命名空间、属性、值)的列表。 |
size | list中条目的数量。 |
示例
该示例首先设置一些上下文属性,随后通过LIST_CONTEXT
返回当前会话的活跃命名空间和上下文属性以及值。
CREATE CONTEXT test_ctx USING ctx_pkg;
DECLARE
att DBMS_SESSION.AppCtxTabTyp;
num NUMBER;
BEGIN
-- set context some values which can be listed later
DBMS_SESSION.SET_CONTEXT('test_ctx', 'a', '1');
DBMS_SESSION.SET_CONTEXT('test_ctx', 'b', '2');
-- list all attributes in context
DBMS_SESSION.LIST_CONTEXT(att, num);
DBMS_OUTPUT.PUT_LINE('Number of attrs in context is: ' || num);
DBMS_OUTPUT.PUT_LINE('The first attr is: ' || att(1).attribute);
DBMS_OUTPUT.PUT_LINE('The first value is: ' || att(1).value);
DBMS_OUTPUT.PUT_LINE('The second attr is: ' || att(2).attribute);
DBMS_OUTPUT.PUT_LINE('The second value is: ' || att(2).value);
END;
-- Number of attrs in context is: 2
-- The first attr is: a
-- The first value is: 1
-- The second attr is: b
-- The second value is: 2
SET_CONTEXT
该存储过程用于设置或者重置上下文属性的值。
语法
DBMS_SESSION.SET_CONTEXT (
namespace IN VARCHAR2,
attribute IN VARCHAR2,
value IN VARCHAR2,
username IN VARCHAR2 DEFAULT NULL,
client_id IN VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
namespace | 待设置上下文的命名空间。 |
attribute | 待设置的上下文属性。 |
value | 属性值。 |
username | (可选参数)兼容性提供参数。默认值为NULL。 |
client_id | (可选参数)兼容性提供参数。默认值为NULL。 |
示例
该示例通过SET_CONTEXT设置上下文属性的值。
CREATE CONTEXT test_ctx USING ctx_pkg;
DECLARE
val varchar(20);
BEGIN
DBMS_SESSION.SET_CONTEXT('test_ctx', 'attr', '1');
val := SYS_CONTEXT('test_ctx', 'attr');
DBMS_OUTPUT.PUT_LINE('attr is:' || val);
END;
-- attr is:1
SET_ROLE
该存储过程用于设置当前上下文的角色。
语法
DBMS_SESSION.SET_ROLE (
role_cmd IN VARCHAR2);
参数说明
参数 | 说明 |
role_cmd | 以字符串的格式指定的角色名称。 |
示例
该示例展示了如何设置会话上下文的角色。
CREATE USER test_ctx_usr IDENTIFIED BY "passwd";
DECLARE
usr varchar(20);
BEGIN
DBMS_SESSION.SET_ROLE('test_ctx_usr');
usr := SYS_CONTEXT('USERENV', 'SESSION_USER');
-- SESSION USER IS: test_ctx_usr
DBMS_OUTPUT.PUT_LINE('SESSION USER IS: ' || usr);
END;
SLEEP
该存储过程用于将当前的会话暂停指定的时长。
语法
DBMS_SESSION.SLEEP (
seconds IN NUMBER);
参数说明
参数 | 说明 |
seconds | 暂停会话的时长(以秒为单位)。 |
示例
该示例展示了如何将会话暂停指定的时长。
EXEC DBMS_SESSION.SLEEP(2);