概述
sys_context函数是Oracle提供的一个获取环境上下文信息的预定义函数。该函数用来返回一个指定namespace下的parameter值。该函数可以在SQL和PL/SQL语言中使用。
sys_context实际上就是一个Oracle存储和传递参数的容器访问函数。我们登入Oracle服务器,是带有会话信息session_info和其他一些属性信息。其中,有一些是Oracle预定义的,登录系统的时候自动填入到指定的变量中。还有一些是我们自己定义到其中,用于传递值使用的。
下面是sys_context函数的使用格式:
sys_context(‘namespace’,’parameter’{,length});
其中,namespace是存储信息的一个组group单位,namespace是按照类别进行分类的。一个namespace下可以有多个参数值,通过不同的parameter进行区分。namespace是预先定义好的SQL标识符,而parameter是可以任意大小写非敏感的字符串,不超过30位长度。函数返回值为varchar2类型,长度默认为256位。如果需要限制这个默认值,可以数据length参数作为新的返回长度值。
系统默认namespace
Attribute | Return Value |
ACTION | Identifies the position in the module (application name) and is set through the DBMS_APPLICATION_INFO package or OCI. |
SELECTsys_context('USERENV', 'ACTION') FROM dual; | |
AUDITED_CURSORID | Returns the cursor ID of the SQL that triggered the audit. This parameter is not valid in a fine-grained auditing environment. If you specify it in such an environment, Oracle Database always returns NULL. |
AUTHENTICATED_IDENTITY | Returns the identity used in authentication. In the list that follows, the type of user is followed by the value returned:
|
AUTHENTICATION_DATA | Data being used to authenticate the login user. For X.503 certificate authenticated sessions, this field returns the context of the certificate in HEX2 format. |
AUTHENTICATION_METHOD | Returns the method of authentication. In the list that follows, the type of user is followed by the method returned.
|
BG_JOB_ID | Job ID of the current session if it was established by an Oracle background process. Null if the session was not established by a background process. |
CLIENT_IDENTIFIER | Returns an identifier that is set by the application through the DBMS_SESSION.SET_IDENTIFIER procedure, the OCI attribute OCI_ATTR_CLIENT_IDENTIFIER, or the Java class Oracle.jdbc.OracleConnection.setClientIdentifier. This attribute is used by various database components to identify lightweight application users who authenticate as the same user. |
SELECTsys_context('USERENV', 'CLIENT_IDENTIFIER') FROM dual; | |
CLIENT_INFO | Returns user session information that can be stored by an application using the DBMS_APPLICATION_INFO package. |
SELECTsys_context('USERENV', 'CLIENT_INFO') FROM dual; | |
CURRENT_BIND | The bind variables for fine-grained auditing |
CURRENT_EDITION_ID | The name of the current edition |
SELECTsys_context('USERENV', 'CURRENT_EDITION_ID') FROM dual; | |
CURRENT_EDITION_NAME | The name of the current edition |
SELECTsys_context('USERENV', 'CURRENT_EDITION_NAME') FROM dual; | |
CURRENT_SCHEMA | Name of the default schema being used in the current schema. This value can be changed during the session with an ALTER SESSION SET CURRENT_SCHEMA statement. |
SELECTsys_context('USERENV', 'CURRENT_SCHEMA') FROM dual; | |
CURRENT_SCHEMAID | Identifier of the default schema being used in the current session. |
SELECTsys_context('USERENV', 'CURRENT_SCHEMAID') FROM dual; | |
CURRENT_SQL | Returns the first 4K bytes of the current SQL that triggered the fine-grained auditing event. |
CURRENT_SQLn | CURRENT_SQLnattributes return subsequent 4K-byte increments, where n can be an integer from 1 to 7, inclusive. CURRENT_SQL1 returns bytes 4K to 8K; CURRENT_SQL2 returns bytes 8K to 12K, and so forth. You can specify these attributes only inside the event handler for the fine-grained auditing feature. |
CURRENT_SQL_LENGTH | The length of the current SQL statement that triggers fine-grained audit or row-level security (RLS) policy functions or event handlers. Valid only inside the function or event handler. |
DB_DOMAIN | Domain of the database as specified in the DB_DOMAIN initialization parameter. |
SELECTsys_context('USERENV', 'DB_DOMAIN') FROM dual; | |
DB_NAME | Name of the database as specified in the DB_NAME initialization parameter. |
SELECTsys_context('USERENV', 'DB_NAME') FROM dual; | |
DB_UNIQUE NAME | Name of the database as specified in the DB_UNIQUE_NAME initialization parameter. |
SELECTsys_context('USERENV', 'DB_UNIQUE_NAME') FROM dual; | |
ENTRYID | The available auditing entry identifier. You cannot use this option in distributed SQL statements. To use this keyword in USERENV, the initialization parameter AUDIT_TRAIL must be set to true. |
ENTERPRISE_IDENTITY | Returns the user's enterprise-wide identity:
The value of the attribute differs by proxy method:
|
FG_JOB_ID | Job ID of the current session if it was established by a client foreground process. Null if the session was not established by a foreground process. |
GLOBAL_CONTEXT_MEMORY | The number used in the System Global Area by the globally accessed context. |
SELECTsys_context('USERENV', 'GLOBAL_CONTEXT_MEMORY') FROM dual; | |
GLOBAL_UID | Returns the global user ID from Oracle Internet Directory for Enterprise User Security (EUS) logins; returns null for all other logins. |
HOST | Name of the host machine from which the client has connected. |
SELECTsys_context('USERENV', 'HOST') FROM dual; | |
IDENTIFICATION_TYPE | Returns the way the user's schema was created in the database. Specifically, it reflects the IDENTIFIED clause in the CREATE/ALTER USER syntax. In the list that follows, the syntax used during schema creation is followed by the identification type returned:
|
SELECTsys_context('USERENV', 'IDENTIFICATION_TYPE') FROM dual; | |
INSTANCE | The instance identification number of the current instance. |
SELECTsys_context('USERENV', 'INSTANCE') FROM dual; | |
INSTANCE_NAME | The name of the instance. |
SELECTsys_context('USERENV', 'INSTANCE_NAME') FROM dual; | |
IP_ADDRESS | IP address of the machine from which the client is connected. |
ISDBA | TRUE if the session is SYS |
SELECTsys_context('USERENV', 'ISDBA') FROM dual; | |
LANG | The ISO abbreviation for the language name, a shorter form. than the existing 'LANGUAGE' parameter. |
SELECTsys_context('USERENV', 'LANG') FROM dual; | |
LANGUAGE | The language and territory currently used by your session, along with the database character set, in the form.: |
SELECTsys_context('USERENV', 'LANGUAGE') FROM dual; | |
MODULE | The application name (module) set through the DBMS_APPLICATION_INFO package or OCI. |
SELECTsys_context('USERENV', 'MODULE') FROM dual; | |
NETWORK_PROTOCOL | Network protocol being used for communication, as specified in the 'PROTOCOL=protocol' portion of the connect string. |
NLS_CALENDAR | The current calendar of the current session. |
SELECTsys_context('USERENV', 'NLS_CALENDAR') FROM dual; | |
NLS_CURRENCY | The currency of the current session. |
SELECTsys_context('USERENV', 'NLS_CURRENCY') FROM dual; | |
NLS_DATE_FORMAT | The date format for the session. |
SELECTsys_context('USERENV', 'NLS_DATE_FORMAT') FROM dual; | |
NLS_DATE_LANGUAGE | The language used for expressing dates. |
SELECTsys_context('USERENV', 'NLS_DATE_LANGUAGE') FROM dual; | |
NLS_SORT | BINARY or the linguistic sort basis. |
SELECTsys_context('USERENV', 'NLS_SORT') FROM dual; | |
NLS_TERRITORY | The territory of the current session. |
SELECTsys_context('USERENV', 'NLS_TERRITORY') FROM dual; | |
OS_USER | Operating system username of the client process that initiated the database session. |
SELECTsys_context('USERENV', 'OS_USER') FROM dual; | |
POLICY_INVOKER | The invoker of row-level security (RLS) policy functions. |
PROXY_ENTERPRISE_IDENTITY | Returns the Oracle Internet Directory DN when the proxy user is an enterprise user. |
PROXY_GLOBAL_UID | Returns the global user ID from Oracle Internet Directory for Enterprise User Security (EUS) proxy users; returns NULL for all other proxy users. |
PROXY_USER | Name of the database user who opened the current session on behalf of SESSION_USER. |
PROXY_USERID | Identifier of the database user who opened the current session on behalf of SESSION_USER. |
SERVER_HOST | The host name of the machine on which the instance is running. |
SELECTsys_context('USERENV', 'SERVER_HOST') FROM dual; | |
SERVICE_NAME | The name of the service to which a given session is connected. |
SELECTsys_context('USERENV', 'SERVICE_NAME') FROM dual; | |
SESSION_USER | Database user name by which the current user is authenticated. This value remains the same throughout the duration of the session. |
SELECTsys_context('USERENV', 'SESSION_USER') FROM dual; | |
SESSION_USERID | Identifier of the database user name by which the current user is authenticated. |
SELECTsys_context('USERENV', 'SESSION_USERID') FROM dual; | |
SESSIONID | The auditing session identifier. You cannot use this option in distributed SQL statements. This is the equivalent to the AUDSID column ingv$session. |
SELECTsys_context('USERENV', 'SESSIONID') FROM dual; | |
SID | The session number (different from the session ID). |
SELECTsys_context('USERENV', 'SID') FROM dual; | |
STATEMENTID | The auditing statement identifier. STATEMENTID represents the number of SQL statements audited in a given session. |
TERMINAL | The operating system identifier for the client of the current session. In distributed SQL statements, this option returns the identifier for your local session. In a distributed environment, this is supported only for remote SELECT statements, not for remote INSERT, UPDATE, or DELETE operations. (The return length of this parameter may vary by operating system.) |
SELECTsys_context('USERENV', 'TERMINAL') FROM dual; |
例子:
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
自定义namespace
除了系统默认的namespace以外,还可以使用dbms_session.set_context设置自定义namespace。
Step 1 自定义一个namespace,并且规定的设置的方法句柄;
SQL> create context Test using set_test_context;
Context created
Step 2 定义方法;
create or replace procedure set_test_context
(
vc_value in varchar2
)
is
begin
dbms_session.set_context('Test','a1',vc_value);
end set_test_context;
Step 3设置上值
SQL> exec set_test_context('m');
PL/SQL procedure successfully completed
获取这个值
SQL> select sys_context('Test','a1') from dual;
SYS_CONTEXT('TEST','A1')
------------------------------------
m