日期:2014-05-16 浏览次数:20479 次
不
知道有没有用过userevn和sys_context这两个方法。?
userenv在我们查看当前用户的session的字符集的时候是经常用到的。?
比如?
select
userenv('language') from dual;?
sys_context的用户和这个userenv类似,是一个保持了和session有关的session级别的上下文。
这个上下文是一个session里的都可以访问到的地方,所以如果我们于需要在这里放入一些session级别的自己的信息,就可以使用这个
sys_context的上下文了。?
那么我们如何把自己的信息放到session里了。Oracle提供了一个DBMS_session的强大的有关session操作的包。文档可见http://download.oracle.com/docs/cd/E11882_01/appdev.112/e10577/d_sessio.htm#i1010942
?
我们可以使用里面的set_context的方法?
DBMS_SESSION.SET_CONTEXT (?
namespace VARCHAR2,?
attribute VARCHAR2,?
value VARCHAR2,?
username VARCHAR2,?
client_id VARCHAR2 );
这里的几个参数的含义?
namespace 这个context的命名空间?
attribute
属性值,即为key值?
value 值?
username 用户名 默认null?
client_id
指定的clientid 默认null这里1-3函数是一定要的,后面两个是可选值,?
我们赶快到sqlplus试试把
SQL> exec dbms_session.set_context('', 'name', 'liuyong');?
BEGIN dbms_session.set_context('', 'name', 'liuyong'); END;?
*?
ERROR at line 1:?
ORA-28106: input value for argument #1 is not valid?
ORA-06512: at "SYS.DBMS_SESSION", line 78?
ORA-06512: at line 1
这里出错了。主要是我们的用法不对,在Oracle的文档里已经描述了,这里的context只能是建立create来使用,那么我们应该如何来用了?
首先建立package来包装这个context?
create or replace package
my_context_p as?
procedure put(key varchar2, value varchar2);?
end;?
/?
create or replace package body my_context_p as?
procedure put(key varchar2, value varchar2) as?
begin?
dbms_session.set_context('my_context
',key,value);?
end;?
end;?
/?
然后建立context?
create or replace context?my_context
?using my_context_p ACCESSED GLOBALLY;?
注意这里的context的名字要和package里set_context的时候一样。 否则后面调用会告诉你ORA-01031:
insufficient privileges。?
调用?
SQL> exec
my_context_p.put('test', 'inthirties');?
检查?
SQL> exec
dbms_output.put_line(sys_context('my_context','test'));?
inthirties?
这样我们就实现了我们需要的功功能呀。