ORACLE中上下文sys_context的创建及应用
ORACLE中上下文sys_context的创建及应用
最近在上的系统需要用到oracle的上下文,所以上网搜了下,写下来以备不时之需。
首先什么是上下文?
我认为就是公共变量。
下面是“inthirties(三十而立)”的解释:
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函数是一定要的,后面两个是可选值,
sys_context的用户和这个userenv类似,是一个保持了和session有关的session级别的上下文。 这个上下文是一个session里的都可以访问到的地方,所以如果我们于需要在这里放入一些session级别的自己的信息,就可以使用这个sys_context的上下文了。
既然是公共变量,当然就要可以自己定义了!
1 SQL> DBMS_SESSION.set_context('testcontext', 'con2','abcd'); 2 3 DBMS_SESSION.set_context('testcontext', 'con2','abcd') 4 5 ORA-00900: invalid SQL statement
直接定义报错!
通过过程生成:
1 CREATE OR REPLACE PROCEDURE execcontext(contextkey in varchar2,contextvalue in varchar2) 2 3 AS 4 BEGIN 5 DBMS_SESSION.set_context('testcontext', contextkey,contextvalue); 6 END; 执行同样报错! 1 SQL> exec execconttext('aaa','bbb'); 2 3 begin execconttext('aaa','bbb'); end; 4 5 ORA-06550: line 2, column 7: 6 PLS-00201: identifier 'EXECCONTTEXT' must be declared 7 ORA-06550: line 2, column 7: 8 PL/SQL: Statement ignored
原来想要用过程定义上下文,需要声明
01 SQL> create or replace context testcontext using execcontext; 02 03 Context created 04 05 SQL> exec execcontext('aa','bb'); 06 07 PL/SQL procedure successfully completed 08 09 SQL> select sys_context('testcontext','aa') from dual; 10 11 SYS_CONTEXT('TESTCONTEXT','AA' 12 -------------------------------------------------------------------------------- 13 bb 14 15 SQL> 另外网上还有通过包定义上下文的,通常会报: 1 ORA-01031: insufficient privileges 2 ORA-06512: at "SYS.DBMS_SESSION", line 101 3 ORA-06512: at "SCOTT.PROCNAME", line 5 4 ORA-06512: at line 2 此为权限问题:需要声明的时候加上 ACCESSED GLOBALLY 1 SQL> CREATE OR REPLACE CONTEXT MYCONTEXT USING MY_PACK_CONTEXT ACCESSED GLOBALLY;
整理一下,流程为:
01 --1、编写定义上下文的过程 02 CREATE OR REPLACE PROCEDURE execcontext(contextkey in varchar2,contextvalue in varchar2) 03 04 AS 05 BEGIN 06 DBMS_SESSION.set_context('testcontext', contextkey,contextvalue); 07 END; 08 09 --2、声明上下文可以用此过程定义 10 create or replace context testcontext using execcontext; 11 12 --3、下面就可以定义了 13 SQL> exec execcontext('aa','bb'); 14 15 PL/SQL procedure successfully completed 16 17 --4、应用,查看什么的 18 SQL> select sys_context('testcontext','aa') from dual; 19 20 SYS_CONTEXT('TESTCONTEXT','AA' 21 -------------------------------------------------------------------------------- 22 bb