DBMS_SESSION 包

DBMS_SESSION包用来访问或者设置会话信息。

17.1 相关方法

  1. CLEAR_ALL_CONTEXT过程

清理当前会话的所有上下文。该过程需通过namespace关联的package调用。

语法如下:

DBMS_SESSION.CLEAR_ALL_CONTEXT(

	namespace VARCHAR(30)

);

参数详解

  • namespace不区分大小写。
  1. 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标识,不起作用,如果指定,则忽略。
  1. IS_SESSION_ALIVE函数

会话是否为活动会话,如果是,则返回TRUE,否则返回FALSE。

语法如下:

DBMS_SESSION.IS_SESSION_ALIVE (

uniqueid BIGINT

)RETURN VARCHAR;

参数详解

  • uniqueid为会话的唯一标识。
  1. 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为输出参数,该索引表中元素的总数。
  1. RESET_PACKAGE过程

清除当前会话上的所有package对象,即可以释放所有package对象占用的内存空间。

语法如下:

DBMS_SESSION.RESET_PACKAGE;

参数详解

无。

  1. 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参数不起作用,如果指定,则忽略。
  1. UNIQUE_SESSION_ID函数

返回唯一会话id。

语法如下:

DBMS_SESSION.UNIQUE_SESSION_ID

RETURN VARCHAR;
  1. 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
微信扫码
分享文档
扫一扫
联系客服