最近在上的系统须要用到oracle的上下文,因此上网搜了下,写下来以备不时之需。 sql
首先什么是上下文? session
我认为就是公共变量。 oracle
下面是“inthirties(三十而立)”的解释: ide
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的上下文了。既然是公共变量,固然就要能够本身定义了!
SQL> DBMS_SESSION.set_context('testcontext', 'con2','abcd'); DBMS_SESSION.set_context('testcontext', 'con2','abcd') ORA-00900: invalid SQL statement
直接定义报错! 函数
经过过程生成: spa
CREATE OR REPLACE PROCEDURE execcontext(contextkey in varchar2,contextvalue in varchar2) AS BEGIN DBMS_SESSION.set_context('testcontext', contextkey,contextvalue); END;
执行一样报错! .net
SQL> exec execconttext('aaa','bbb'); begin execconttext('aaa','bbb'); end; ORA-06550: line 2, column 7: PLS-00201: identifier 'EXECCONTTEXT' must be declared ORA-06550: line 2, column 7: PL/SQL: Statement ignored
原来想要用过程定义上下文,须要声明 code
SQL> create or replace context testcontext using execcontext; Context created SQL> exec execcontext('aa','bb'); PL/SQL procedure successfully completed SQL> select sys_context('testcontext','aa') from dual; SYS_CONTEXT('TESTCONTEXT','AA' -------------------------------------------------------------------------------- bb SQL>另外网上还有经过包定义上下文的,一般会报:
ORA-01031: insufficient privileges ORA-06512: at "SYS.DBMS_SESSION", line 101 ORA-06512: at "SCOTT.PROCNAME", line 5 ORA-06512: at line 2此为权限问题:须要声明的时候加上 ACCESSED GLOBALLY
SQL> CREATE OR REPLACE CONTEXT MYCONTEXT USING MY_PACK_CONTEXT ACCESSED GLOBALLY;
整理一下,流程为: blog
--一、编写定义上下文的过程 CREATE OR REPLACE PROCEDURE execcontext(contextkey in varchar2,contextvalue in varchar2) AS BEGIN DBMS_SESSION.set_context('testcontext', contextkey,contextvalue); END; --二、声明上下文能够用此过程定义 create or replace context testcontext using execcontext; --三、下面就能够定义了 SQL> exec execcontext('aa','bb'); PL/SQL procedure successfully completed --四、应用,查看什么的 SQL> select sys_context('testcontext','aa') from dual; SYS_CONTEXT('TESTCONTEXT','AA' -------------------------------------------------------------------------------- bb