sys_context獲取當前會話的屬性

hurp_oracle發表於2014-11-18

修改 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章