DBMS_SESSION包用来访问或者设置会话信息。
17.1 相关方法
- CLEAR_ALL_CONTEXT过程
清理当前会话的所有上下文。该过程需通过namespace关联的package调用。
语法如下:
DBMS_SESSION.CLEAR_ALL_CONTEXT(
namespace VARCHAR(30)
);
参数详解
- namespace不区分大小写。
- CLEAR_CONTEXT过程
清理namespace中的attribute值。该过程需通过上下文namespace关联的package调用。
语法如下:
DBMS_SESSION.CLEAR_CONTEXT
namespace VARCHAR(30),
client_identifier VARCHAR(30)
attribute VARCHAR(30)
);
参数详解
- namespace和attribute不区分大小写。
- client_identifier用于全局访问的client标识,不起作用,如果指定,则忽略。
- IS_SESSION_ALIVE函数
会话是否为活动会话,如果是,则返回TRUE,否则返回FALSE。
语法如下:
DBMS_SESSION.IS_SESSION_ALIVE (
uniqueid BIGINT
)RETURN VARCHAR;
参数详解
- uniqueid为会话的唯一标识。
- LIST_CONTEXT过程
返回当前会话所有上下文属性和值。
语法如下:
TYPE AppCtxRecTyp IS RECORD(
namespace VARCHAR2(30),
attribute VARCHAR2(30),
value VARCHAR2(256)
);
TYPE AppCtxTabTyp IS TABLE OF AppCtxRecTyp INDEX BY BINARY_INTEGER;
DBMS_SESSION.LIST_CONTEXT(
list OUT AppCtxTabTyp,
size OUT NUMBER
);
参数详解
- list为输出参数,类型为索引表。
- size为输出参数,该索引表中元素的总数。
- RESET_PACKAGE过程
清除当前会话上的所有package对象,即可以释放所有package对象占用的内存空间。
语法如下:
DBMS_SESSION.RESET_PACKAGE;
参数详解
无。
- SET_CONTEXT过程
设置上下文 namespace的属性和值。
语法如下:
DBMS_SESSION.SET_CONTEXT (
namespace VARCHAR(30),
attribute VARCHAR(30),
value VARCHAR(4000),
username VARCHAR(128),
client_id VARCHAR(64)
);
参数详解
- namespace和attribute不区分大小写。
- username和client_id参数不起作用,如果指定,则忽略。
- UNIQUE_SESSION_ID函数
返回唯一会话id。
语法如下:
DBMS_SESSION.UNIQUE_SESSION_ID
RETURN VARCHAR;
- CLOSE_DATABASE_LINK过程
关闭一个指定的打开的外部链接,若该外部链接正在使用中(可通过V$DBLINK进行查询),则报错。
语法如下:
DBMS_SESSION.CLOSE_DATABASE_LINK (
dblink VARCHAR(128)
);
参数详解
- dblink为指定的要关闭的外部链接名。
17.2 举例说明
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_SESSION');
初始化环境:
--创建上下文关联的包
create or replace package test_pk as
procedure set_context(ts_name varchar, key varchar, value varchar);
procedure clear_context(ts_name varchar, clientid varchar, key varchar);
procedure clear_all_context(ts_name varchar);
end test_pk;
/
create or replace package body test_pk as
procedure set_context(ts_name varchar, key varchar, value varchar) as
begin
dbms_session.set_context(ts_name, key, value);
end;
procedure clear_context(ts_name varchar, clientid varchar, key varchar) as
begin
dbms_session.clear_context(ts_name, clientid, key);
end;
procedure clear_all_context(ts_name varchar) as
begin
dbms_session.clear_all_context(ts_name);
end;
end test_pk;
/
--创建上下文C_TEST
create or replace context C_TEST using test_pk;
例1 设置上下文c_test的属性和值。
call test_pk.set_context('c_test', 'k1', 'v1');
call test_pk.set_context('c_test', 'k2', 'v2');
例2 查询上下文C_TEST的属性K1的值。
select sys_context('c_test', 'k1') from dual;
结果如下:
v1
例3 清除上下文C_TEST属性K1的值。
call test_pk.clear_context('c_test', null, 'k1');
再次查询名字空间C_TEST的属性K1的值。
select sys_context('c_test', 'k1') from dual;
结果如下:
NULL
例4 当前会话是否为活动会话
select dbms_session.IS_SESSION_ALIVE(dbms_session.unique_session_id) from dual;
结果如下:
TRUE
例5 打印当前会话所有的上下文属性和值
declare
TYPE AppCtxRecTyp IS RECORD (
namespace VARCHAR2(30),
attribute VARCHAR2(30),
value VARCHAR2(256));
TYPE AppCtxTabTyp IS TABLE OF AppCtxRecTyp INDEX BY BINARY_INTEGER;
res AppCtxTabTyp;
num int;
begin
DBMS_SESSION.LIST_CONTEXT (res, num);
for i in 0..num-1 loop
print res(i).namespace;
print res(i).ATTRIBUTE;
print res(i).VALUE;
end loop;
end;
/
结果如下:
C_TEST
k1
NULL
C_TEST
k2
v2
例6 删除上下文C_TEST
drop context c_test;
例7 清理当前会话的package对象
create or replace package test_p is
cnt number := 0;
procedure print_status;
end test_p;
/
create or replace package body test_p is
procedure print_status is
begin
print 'test_p.cnt = ' || cnt;
end;
end;
/
初始化并打印值:
begin
test_p.cnt := 5236;
test_p.print_status;
end;
/
输出结果:
test_p.cnt = 5236
打印CNT值:
begin
test_p.print_status;
end;
/
输出结果:
test_p.cnt = 5236
清理包对象:
CALL DBMS_SESSION.RESET_PACKAGE;
再打印CNT值:
begin
test_p.print_status;
end;
/
输出结果:
test_p.cnt = 0