ORACLE 中上下文 sys_context的建立及應用

最近在上的系統須要用到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
相關文章
相關標籤/搜索