天天看點

sys_context擷取目前會話的屬性

修改 USERENV('LANG')傳回值

SQL> ALTER SESSION SET NLS_LANGUAGE='AMERICAN';

Session altered.

SQL> select USERENV('LANG') from dual;

USERENV('LANG')

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

US

SQL>  ALTER SESSION SET NLS_LANGUAGE='SIMPLIFIED CHINESE';

會話已更改。

SQL> select USERENV('LANG') from dual;

USERENV('LANG')

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

ZHS

SQL>

過程修改為:

execute immediate 'ALTER SESSION SET NLS_LANGUAGE = ''SIMPLIFIED CHINESE''';

 SYS_CONTEXT 函數傳回是與上下文名稱空間相關的屬性值。這個函數可以用在SQL和PL/SQL語句中。

注意: SYS_CONTEXT 傳回的是使用者會話期間的屬性,是以,你無法使用它在并行的查詢或實時應用叢集環境。

對于名稱空間和變量, 你可以定義它(們)為常量字元串,也可以定義一個變量,來代替名稱空間或屬性的字元串。名稱空間必須是已經在資料庫中定義好的, 并且相關的參數和值已經被指定到DBMS_SESSION中。名稱空間必須是一個合法的SQL辨別符。變量名字可以是任意的字元串。它們不區分大小寫, 但是長度不能超出30個位元組。

函數傳回的資料類型是VARCHAR2,回歸值的預設最大長度是256個位元組。你也可以通過設定函數參數length來修改這個預設長度值。值的合法的長度範圍是1到4000位元組。(如果你指定的值不在這個範圍内, Oracle将使用預設長度。)

Oracle9i 提供了一個内置的“USERENV”名稱空間, 用來表示目前的會話資訊。該名稱空間預定義的參數如表1, 表的最後一列辨別了傳回值的長度。

文法:

SYS_CONTEXT(namespace, attribute[, length])

表1:USERENV表空間預定義的屬性

Parameter Return Value Return Length (bytes)
AUDITED_CURSORID 傳回目前觸發查檢要SQL的遊标ID NA
AUTHENTICATION_DATA

使用者認證資料。 經過X.503 認證确定的會話,該屬性以HEX2格式傳回上下文認證資訊

注意:可以通過length參數改變 AUTHENTICATION_DATA屬性傳回的長度值。 長度上限是4000。這是Oracle 名稱空間USERENV僅有變化的屬性

256
AUTHENTICATION_TYPE

使用者誰類型:

<!--[if !supportLists]--&gtü     <!--[endif]--&gtDATABASE:使用者名/密碼 認證

<!--[if !supportLists]--&gtü     <!--[endif]--&gtOS:作業系統使用者 認證

<!--[if !supportLists]--&gtü     <!--[endif]--&gtNETWORK:網絡協定或ANO認證

<!--[if !supportLists]--&gtü     <!--[endif]--&gtPROXY:OCI連接配接代理認證

30
BG_JOB_ID 在目前會話中由Oracle背景程序建立的Job ID. 如果目前會話中沒有背景程序建立任何JOB,則傳回空 30
CLIENT_IDENTIFIER 傳回用戶端在全局上下文中的辨別,包括可以被全局被通路的上下文或者在OCI上下文中的 OCI_ATTR_CLIENT_IDENTIFIER 屬性。 如沒有相關辨別,則傳回空 64
CLIENT_INFO 傳回使用者會話資訊,該資訊最多64位元組,這些資訊是應用程式通過 DBMS_APPLICATION_INFO包package設定的 64
CURRENT_SCHEMA 目前模式名。該值可以通過ALTER SESSION SET CURRENT_SCHEMA來改變 30
CURRENT_SCHEMAID 目前預設會話模式辨別 30
CURRENT_SQL 目前會話中最近執行的SQL。 隻能通過 内置事件Fine-Grained Auditing 屬性指定該屬性 64
CURRENT_USER 目前登入的使用者名 30
CURRENT_USERID 目前登入的使用者ID 30
DB_DOMAIN 目前資料庫所在域 256
DB_NAME 目前資料庫名 30
ENTRYID 預設實體辨別。它可以用于分布式SQL中。如果在USERENV想使用該屬性,必須将AUDIT_TRAIL初始為true。 30
EXTERNAL_NAME 目前會話使用者的外部名字。對于使用v.503 認證SSL的會話,該值傳回包含使用者認證資訊的名字(DN) 256
FG_JOB_ID 目前會話執行的JOB的辨別,如果沒有則傳回空 30
GLOBAL_CONTEXT_MEMORY 傳回全局區域中使用的記憶體數 NA
HOST 客戶機的名字 54
INSTANCE 目前執行個體的數量 30
IP_ADDRESS 用戶端的IP位址 30
ISDBA 傳回目前使用者是否有DBA權限 30
LANG 傳回目前使用者會話使用的語言縮寫,該縮寫遵循ISO規定 62
LANGUAGE

目前使用者使用的語言,包括目前資料庫的字元集,并遵循如下格式:

language_territory.characterset

52
NETWORK_PROTOCOL 目前用戶端連接配接資料庫的通路協定 256
NLS_CALENDAR 目前會話月曆 62
NLS_CURRENCY 目前會話貨币種類 62
NLS_DATE_FORMAT 目前會話日期格式 62
NLS_DATE_LANGUAGE 描述目前日期格式的語言 62
NLS_SORT 排序規則,BINARY或按語言排序 62
NLS_TERRITORY 目前會話區域 62
OS_USER 目前會話使用者在作業系統裡的使用者名 30
PROXY_USER 代理使用者名 30
PROXY_USERID 代理使用者辨別 30
SESSIONID 會話辨別 30
TERMINAL 目前會話用戶端作業系統辨別。分布式SQL中該屬性隻傳回你所對應會話的辨別。分布式會話中隻支援SELECT操作,不支援INSERT,UPDATE,DELETE 操作。(傳回值的長度可能由于不同的作業系統有所不同) 10

例子:

SELECT SYS_CONTEXT ('USERENV', 'TERMINAL') TERMINAL,

       SYS_CONTEXT ('USERENV', 'LANGUAGE') LANGUAGE,

       SYS_CONTEXT ('USERENV', 'SESSIONID') SESSIONID,

       SYS_CONTEXT ('USERENV', 'INSTANCE') INSTANCE,

       SYS_CONTEXT ('USERENV', 'ENTRYID') ENTRYID,

       SYS_CONTEXT ('USERENV', 'ISDBA') ISDBA,

       SYS_CONTEXT ('USERENV', 'NLS_TERRITORY') NLS_TERRITORY,

       SYS_CONTEXT ('USERENV', 'NLS_CURRENCY') NLS_CURRENCY,

       SYS_CONTEXT ('USERENV', 'NLS_CALENDAR') NLS_CALENDAR,

       SYS_CONTEXT ('USERENV', 'NLS_DATE_FORMAT') NLS_DATE_FORMAT,

       SYS_CONTEXT ('USERENV', 'NLS_DATE_LANGUAGE') NLS_DATE_LANGUAGE,

       SYS_CONTEXT ('USERENV', 'NLS_SORT') NLS_SORT,

       SYS_CONTEXT ('USERENV', 'CURRENT_USER') CURRENT_USER,

       SYS_CONTEXT ('USERENV', 'CURRENT_USERID') CURRENT_USERID,

       SYS_CONTEXT ('USERENV', 'SESSION_USER') SESSION_USER,

       SYS_CONTEXT ('USERENV', 'SESSION_USERID') SESSION_USERID,

       SYS_CONTEXT ('USERENV', 'PROXY_USER') PROXY_USER,

       SYS_CONTEXT ('USERENV', 'PROXY_USERID') PROXY_USERID,

       SYS_CONTEXT ('USERENV', 'DB_DOMAIN') DB_DOMAIN,

       SYS_CONTEXT ('USERENV', 'DB_NAME') DB_NAME,

       SYS_CONTEXT ('USERENV', 'HOST') HOST,

       SYS_CONTEXT ('USERENV', 'OS_USER') OS_USER,

       SYS_CONTEXT ('USERENV', 'EXTERNAL_NAME') EXTERNAL_NAME,

       SYS_CONTEXT ('USERENV', 'IP_ADDRESS') IP_ADDRESS,

       SYS_CONTEXT ('USERENV', 'NETWORK_PROTOCOL') NETWORK_PROTOCOL,

       SYS_CONTEXT ('USERENV', 'BG_JOB_ID') BG_JOB_ID,

       SYS_CONTEXT ('USERENV', 'FG_JOB_ID') FG_JOB_ID,

       SYS_CONTEXT ('USERENV', 'AUTHENTICATION_TYPE') AUTHENTICATION_TYPE,

       SYS_CONTEXT ('USERENV', 'AUTHENTICATION_DATA') AUTHENTICATION_DATA

  FROM DUAL;

 下面的語句傳回登入使用者的名字:

CONNECT OE/OE

SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER')

   FROM DUAL;

SYS_CONTEXT ('USERENV', 'SESSION_USER')

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

OE

下面的例子假設已經在PL/SQL包中設定了hr_apps名稱空間,并設定了group_no屬性,該查詢傳回這個屬性值:

SELECT SYS_CONTEXT ('hr_apps', 'group_no') "User Group"

   FROM DUAL;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1337771/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/29446986/viewspace-1337771/