当前位置:数据库 > Oracle >>

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

 


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,