【Oracle】自定义CONTEXT(上下文)
xixuefeng
Oracle, SQL&Function, Utilities
2012-12-29 21:48:46
923 次浏览
【Oracle】自定义CONTEXT(上下文)已关闭评论
Oracle提供的 sys_context 函数来得到跟 session 相关的上下文,比如:
1 2 3 4 5 6 7 |
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> |
如果需要返回一些属于我们自己的上下文,当然,我们可以自己来定义。
一、设置上下文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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的方式手工执行。 |
二、创建上下文语法
1 2 3 4 5 6 |
CREATE [ OR REPLACE ] CONTEXT namespace USING [ schema. ] package [ INITIALIZED { EXTERNALLY | GLOBALLY }| ACCESSED GLOBALLY] ; INITIALIZED子句:指定实体意外的其他数据库 ACCESSED GLOBALLY:当前实例任何应用程序都可以访问上下文,多个会话可以共享上下文的属性。 |
三、自定义上下文测试
1):创建一个简单的过程,过程的功能为初始化自定义上下文,以字符串形式返回系统时间的年月日
1 2 3 4 5 6 7 8 9 |
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,利用刚刚创建好的过程
1 2 3 4 5 |
SYSTEM@ORA11GR2> create or replace context my_context using sp_context; Context created. SYSTEM@ORA11GR2> |
3):验证自定义上下文my_context,结果返回为null,原因是,我们没有初始化’XXF’属性
1 2 3 4 5 6 7 |
SYSTEM@ORA11GR2> select sys_context('MY_CONTEXT', 'XXF') from dual; SYS_CONTEXT('MY_CONTEXT','XXF') ------------------------------------------------------------------ SYSTEM@ORA11GR2> |
4):手工执行一下过程sp_context
1 2 3 4 5 |
SYSTEM@ORA11GR2> exec sp_context PL/SQL procedure successfully completed. SYSTEM@ORA11GR2> |
5):再次验证自定义上下文sys_context,返回了我们想要的结果,此时有朋友会问,这也太麻烦了,每次都需要手工执行一下过程,其实这个问题很好解决,我们可以通过触发器来解决此问题。
1 2 3 4 5 6 7 |
SYSTEM@ORA11GR2> select sys_context('MY_CONTEXT', 'XXF') from dual; SYS_CONTEXT('MY_CONTEXT','XXF') ------------------------------------------------------------------ 20121129 SYSTEM@ORA11GR2> |
6):创建一个数据库级触发器,每次登陆后都触发过程sp_context
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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):重新登陆一个新的会话,验证自定义上下文,成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[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的系统权限