oracle context(上下文)

context在計算機領域翻譯爲上下文

context的信息也就是當前會話中的環境變量,如:登錄的session_id,用戶名,語言等信息


查看context中的屬性信息。

oracle默認的爲我們創建了一個context叫userenv(user environment)


SYS_CONTEXT('USERENV','TERMINAL') 

SYS_CONTEXT('USERENV','LANGUAGE')

SYS_CONTEXT('USERENV','SESSIONID') 

SYS_CONTEXT('USERENV','INSTANCE')

SYS_CONTEXT('USERENV','ENTRYID') 

SYS_CONTEXT('USERENV','ISDBA') 

SYS_CONTEXT('USERENV','NLS_TERRITORY') 

SYS_CONTEXT('USERENV','NLS_CURRENCY')

SYS_CONTEXT('USERENV','NLS_CALENDAR') 

SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') 

SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') 

SYS_CONTEXT('USERENV','NLS_SORT') 

SYS_CONTEXT('USERENV','CURRENT_USER')

SYS_CONTEXT('USERENV','CURRENT_USERID') 

SYS_CONTEXT('USERENV','SESSION_USER') 

SYS_CONTEXT('USERENV','SESSION_USERID') 

SYS_CONTEXT('USERENV','PROXY_USER') 

SYS_CONTEXT('USERENV','PROXY_USERID') 

SYS_CONTEXT('USERENV','DB_DOMAIN') 

SYS_CONTEXT('USERENV','DB_NAME') 

SYS_CONTEXT('USERENV','HOST') 

SYS_CONTEXT('USERENV','OS_USER') 

SYS_CONTEXT('USERENV','EXTERNAL_NAME') 

SYS_CONTEXT('USERENV','IP_ADDRESS') 

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') 

SYS_CONTEXT('USERENV','BG_JOB_ID') 

SYS_CONTEXT('USERENV','FG_JOB_ID') 

SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')

SYS_CONTEXT('USERENV','AUTHENTICATION_DATA')  


例子:


產看當前session的字符集信息

SQL> select userenv('language') from dual;


USERENV('LANGUAGE')

----------------------------------------------------

AMERICAN_AMERICA.AL32UTF8




創建自定義oracle context

Application Context是內存中的一組name-value對,application context從屬於某個命名空間(namespace);

用戶只能通過一個自定義封裝包或存儲過程中調用dbms_session.set_context來設置application context的值;

用戶使用sys_context(<namespace>,<name>)來獲取某個application context的值。


語法:


DBMS_SESSION.SET_CONTEXT


 ( namespaceVARCHAR2, attribute VARCHAR2, value VARCHAR2, username VARCHAR2, client_idVARCHAR2 );


namespace context的命名空間 --必要參數

attribute 屬性值 --必要參數

value --必要參數

username 用戶名(默認爲Null) --可選參數

client_id 指定的clientid --可選參數




Application context分爲三種


dabase session-based application context --local application context

global application context --global application context

client session-based application context --通過OCI管理使用的,存儲在客戶端內存的context





Local applicationcontext

context存儲在UGA中,本地context是session/server process級別的,當會話/serverprocess終止時,context也會結束


Global application context

context存儲在SGA中,SGA消失,全局context也就會結束;它常常用於跨會話,應用於與會話無關的場景




例子:


1.創建一個context


SQL> create context context_only using pkg_only;


Context created.



2.建立與上下文先關的包來封裝(也就是上面的pkg_name)

SQL> create package pkg_only

  2  as

  3  procedure put(key varchar2,value varchar2);

  4  end;

  5  /


Package created.


SQL> create package body pkg_only 

  2  as

  3  procedure put(key varchar2,value varchar2)

  4  as

  5  begin

  6  dbms_session.set_context('context_only',key,value);

  7  end;

  8  end;

  9  /


Package body created.



3.設置存儲過程輸入輸出

SQL> exec pkg_only.put('name','only');


PL/SQL procedure successfully completed.



4.調用context

SQL> select sys_context('context_only','name') from dual;


SYS_CONTEXT('CONTEXT_ONLY','NAME')

--------------------------------------------------------------------------------

only




 


dbms_session.set_context有兩個默認值爲NULL的參數:username、client_id



       username= null , client_id=null。所有用戶都能訪問。


       username= null, client_id=<client_id>。只要session 的client_id =<client_id>,而不管username,都能訪問。


       username= <database username>, client_id=null。只要session使用指定的oracle schema登陸,不管client_id,都能訪問。


       username= <database username>, client_id=<client_id>. 常用於statless web session ,如http。


       username= <non-database username>, client_id=<client_id> . 該username將用於數據庫連接池的owner。


整理自網絡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章