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(,)來獲取某個application context的值。
語法:
DBMS_SESSION.SET_CONTEXT
( namespaceVARCHAR2, attribute VARCHAR2, value VARCHAR2, username VARCHAR2, client_idVARCHAR2 );
namespacecontext的命名空間--必要參數
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=。只要session 的client_id =,而不管username,都能訪問。
username= , client_id=null。只要session使用指定的oracle schema登陸,不管client_id,都能訪問。
username= , client_id=. 常用于statless web session ,如http。
username= , client_id= . 該username將用于數據庫連接池的owner。
整理自網絡