oracle提供的sys_context函数来得到跟session相关的上下文,比如:
SCOTT@ORA11GR2>select sys_context('userenv','db_name') db_name,sys_context('userenv','host') host_name from dual;
DB_NAME HOST_NAME
-------- ----------
ORA11GR2 ocmu
SCOTT@ORA11GR2>
如果需要返回一些属于我们自己的上下文,当然,我们可以自己来定义。
一、设置上下文:
DBMS_SESSION.SET_CONTEXT (
namespace VARCHAR2,
attribute VARCHAR2,
value VARCHAR2,
username VARCHAR2,
client_id VARCHAR2 );
参数含义:
namespace:上下文的名称
attribute:上下文的属性
value:上下文的值
username:应用程序上下文属性数据库的用户名,默认值为null
client_id:特定于应用程序的client_id,默认值为null
特别注意:DBMS_SESSION.SET_CONTEXT这个过程必须使用包或者过程等来调用,不能直接exec的方式手工执行。
二、创建上下文语法:
CREATE [ OR REPLACE ] CONTEXT namespace
USING [ schema. ] package
[ INITIALIZED { EXTERNALLY | GLOBALLY }| ACCESSED GLOBALLY] ;
INITIALIZED子句:指定实体意外的其他数据库
ACCESSED GLOBALLY:当前实例任何应用程序都可以访问上下文,多个会话可以共享上下文的属性。
三、自定义上下文测试:
1):创建一个简单的过程,过程的功能为初始化自定义上下文,以字符串形式返回系统时间的年月日
SYSTEM@ORA11GR2>CREATE OR REPLACE PROCEDURE sp_context IS
BEGIN
dbms_session.set_context('MY_CONTEXT', 'XXF', to_char(sysdate,'yyyymmdd'));
END;
/
Procedure created.
SYSTEM@ORA11GR2>
2):创建自定义上下文my_context,利用刚刚创建好的过程
SYSTEM@ORA11GR2>create or replace context my_context using sp_context;
Context created.
SYSTEM@ORA11GR2>
3):验证自定义上下文my_context,结果返回为null,原因是,我们没有初始化'XXF'属性
SYSTEM@ORA11GR2>select sys_context('MY_CONTEXT', 'XXF') from dual;
SYS_CONTEXT('MY_CONTEXT','XXF')
------------------------------------------------------------------
SYSTEM@ORA11GR2>
4):手工执行一下过程sp_context
SYSTEM@ORA11GR2>exec sp_context
PL/SQL procedure successfully completed.
SYSTEM@ORA11GR2>
5):再次验证自定义上下文sys_context,返回了我们想要的结果,此时有朋友会问,这也太麻烦了,每次都需要手工执行一下过程,其实这个问题很好解决,我们可以通过触发器来解决此问题。
SYSTEM@ORA11GR2>select sys_context('MY_CONTEXT', 'XXF') from dual;
SYS_CONTEXT('MY_CONTEXT','XXF')
------------------------------------------------------------------
20121129
SYSTEM@ORA11GR2>
6):创建一个数据库级触发器,每次登陆后都触发过程sp_context
SYSTEM@ORA11GR2>create or replace trigger trg_context
after logon on database
begin
sp_context;
end;
/
Trigger created.
SYSTEM@ORA11GR2>exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@ocmu ~]$
7):重新登陆一个新的会话,验证自定义上下文,成功。
[oracle@ocmu ~]$ sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on Thu Nov 29 21:26:59 2012
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@ORA11GR2>select sys_context('MY_CONTEXT', 'XXF') from dual;
SYS_CONTEXT('MY_CONTEXT','XXF')
-----------------------------------------------------------------
20121129
SCOTT@ORA11GR2>
四、小结:
1)创建上下文,默认情况下是ACCESSED GLOBALLY,SCOTT用户都可以直接使用。
2)本例只是一个简单的测试,如果有复杂的需求,那么可以在过程中完成复杂的逻辑来实现需求。
3)创建上下文需要有CREATE ANY CONTEXT的系统权限