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。
整理自網絡