sys_context函数是Oracle提供的一个获取环境上下文信息的预定义函数。
该函数用来返回一个指定namespace下的parameter值;可以在sql和PL/SQL语言中使用。
sys_context实际是一个Oracle存储和传递参数的容器访问函数。
Session会话在登入Oracle时,是带有会话信息和其他一些属性信息的。其中,有一些是Oracle预定义的,登录系统的时候自动填入到指定的变量中。另一个函数userenv()保留与之兼容。
SYS_CONTEXT函数的用法如下:SYS_CONTEXT(‘namespace’, ‘parameter’ [, length ])
Oracle已经有内置的命名空间namespace(USERENV)用来返回当前会话的信息,
USEREN命名空间有以下参数:
select
SYS_CONTEXT(‘USERENV’,‘ACTION’) ACTION,
SYS_CONTEXT(‘USERENV’,‘AUDITED_CURSORID’) AUDITED_CURSORID,
SYS_CONTEXT(‘USERENV’,‘AUTHENTICATED_IDENTITY’) AUTHENTICATED_IDENTITY,
SYS_CONTEXT(‘USERENV’,‘AUTHENTICATION_DATA’) AUTHENTICATION_DATA,
SYS_CONTEXT(‘USERENV’,‘AUTHENTICATION_METHOD’) AUTHENTICATION_METHOD,
SYS_CONTEXT(‘USERENV’,‘BG_JOB_ID’) BG_JOB_ID,
SYS_CONTEXT(‘USERENV’,‘CLIENT_IDENTIFIER’) CLIENT_IDENTIFIER,
SYS_CONTEXT(‘USERENV’,‘CLIENT_INFO’) CLIENT_INFO,
SYS_CONTEXT(‘USERENV’,‘CURRENT_BIND’) CURRENT_BIND,
SYS_CONTEXT(‘USERENV’,‘CURRENT_SCHEMA’) CURRENT_SCHEMA,
SYS_CONTEXT(‘USERENV’,‘CURRENT_SCHEMAID’) CURRENT_SCHEMAID,
SYS_CONTEXT(‘USERENV’,‘CURRENT_SQL’) CURRENT_SQL,
SYS_CONTEXT(‘USERENV’,‘CURRENT_SQL_LENGTH’) CURRENT_SQL_LENGTH,
SYS_CONTEXT(‘USERENV’,‘DB_DOMAIN’) DB_DOMAIN,
SYS_CONTEXT(‘USERENV’,‘DB_NAME’) DB_NAME,
SYS_CONTEXT(‘USERENV’,‘DB_UNIQUE_NAME’) DB_UNIQUE_NAME,
SYS_CONTEXT(‘USERENV’,‘ENTRYID’) ENTRYID,
SYS_CONTEXT(‘USERENV’,‘ENTERPRISE_IDENTITY’) ENTERPRISE_IDENTITY,
SYS_CONTEXT(‘USERENV’,‘FG_JOB_ID’) FG_JOB_ID,
SYS_CONTEXT(‘USERENV’,‘GLOBAL_CONTEXT_MEMORY’) GLOBAL_CONTEXT_MEMORY,
SYS_CONTEXT(‘USERENV’,‘GLOBAL_UID’) GLOBAL_UID,
SYS_CONTEXT(‘USERENV’,‘HOST’) HOST,
SYS_CONTEXT(‘USERENV’,‘IDENTIFICATION_TYPE’) IDENTIFICATION_TYPE,
SYS_CONTEXT(‘USERENV’,‘INSTANCE’) INSTANCE,
SYS_CONTEXT(‘USERENV’,‘INSTANCE_NAME’) INSTANCE_NAME,
SYS_CONTEXT(‘USERENV’,‘IP_ADDRESS’) IP_ADDRESS,
SYS_CONTEXT(‘USERENV’,‘ISDBA’) ISDBA,
SYS_CONTEXT(‘USERENV’,‘LANG’) LANG,
SYS_CONTEXT(‘USERENV’,‘LANGUAGE’) LANGUAGE,
SYS_CONTEXT(‘USERENV’,‘MODULE’) MODULE,
SYS_CONTEXT(‘USERENV’,‘NETWORK_PROTOCOL’) NETWORK_PROTOCOL,
SYS_CONTEXT(‘USERENV’,‘NLS_CALENDAR’) NLS_CALENDAR,
SYS_CONTEXT(‘USERENV’,‘NLS_CURRENCY’) NLS_CURRENCY,
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’,‘NLS_TERRITORY’) NLS_TERRITORY,
SYS_CONTEXT(‘USERENV’,‘OS_USER’) OS_USER,
SYS_CONTEXT(‘USERENV’,‘POLICY_INVOKER’) POLICY_INVOKER,
SYS_CONTEXT(‘USERENV’,‘PROXY_ENTERPRISE_IDENTITY’) PROXY_ENTERPRISE_IDENTITY,
SYS_CONTEXT(‘USERENV’,‘PROXY_USER’) PROXY_USER,
SYS_CONTEXT(‘USERENV’,‘PROXY_USERID’) PROXY_USERID,
SYS_CONTEXT(‘USERENV’,‘SERVER_HOST’) SERVER_HOST,
SYS_CONTEXT(‘USERENV’,‘SERVICE_NAME’) SERVICE_NAME,
SYS_CONTEXT(‘USERENV’,‘SESSION_USER’) SESSION_USER,
SYS_CONTEXT(‘USERENV’,‘SESSION_USERID’) SESSION_USERID,
SYS_CONTEXT(‘USERENV’,‘SESSIONID’) SESSIONID,
SYS_CONTEXT(‘USERENV’,‘SID’) SID,
SYS_CONTEXT(‘USERENV’,‘STATEMENTID’) STATEMENTID,
SYS_CONTEXT(‘USERENV’,‘TERMINAL’) TERMINAL
from dual;
运行一下就能大概知道每个参数的意思。
这里再解释下:
--用户的认证类型
select sys_context('USERENV','AUTHENTICATION_DATA') from dual;
select sys_context('USERENV','BG_JOB_ID') from dual;
--当前指定id的会话是否为oracle后台程序建立,不是则返回null
select sys_context('USERENV','CLIENT_INFO') from dual;
--通过dbms_application_info包可以存储高达64字节的用户会话信息
select sys_context('USERENV','CURRENT_SCHEMA') from dual;
--默认的schema将被当做当前的schema。当在当前会话中使用ALTER SESSION SET CURRENT_SCHEMA语句的时候,它的查询返回值将被改变
select sys_context('USERENV','CURRENT_SCHEMAID') from dual;
--当前schema的id
select sys_context('USERENV','CURRENT_USER') from dual;
--当前的登陆用户
select REPLACE(SUBSTR(sys_context('USERENV','HOST'),1,30),'\',':') from dual;
--当前会话主机操作系统名
select sys_context('USERENV','CURRENT_USERID') from dual;
--当前登陆的用户的id
select sys_context('USERENV','DB_DOMAIN') from dual;
--为数据库的域指定初始化参数
select sys_context('USERENV','DB_NAME') from dual;
--数据库实例名
select sys_context('USERENV','ENTRYID') from dual;
--可用的审计标示符。不能再分布式sql语句中使用此选项。使用USERENV关键字必须置AUDIT_TRAIL的初始化参数为真。
select sys_context('USERENV','EXTERNAL_NAME') from dual;
--数据库用户的扩展名
select sys_context('USERENV','FG_JOB_ID') from dual;
--返回作业id当此会话是客户端进程创建。否则,返回null
select sys_context('USERENV','INSTANCE') from dual;
--当前数据库实例的标示id
select sys_context('USERENV','ISDBA') from dual;
--当前用户是否是以dba身份登录
select sys_context('USERENV','LANG') from dual;
--iso对‘LANGUAGE’的简称,查询的参数比“LANGUAGE”短
select sys_context('USERENV','LANGUAGE') from dual;
--结果为当前数据库使用的存储语言,跟上面查询意义一样
select sys_context('USERENV','NETWORK_PROTOCOL') from dual;
--用于通信的网络协议
select sys_context('USERENV','NLS_CALENDAR') from dual;
--当前会话使用的,格林尼治时间
select sys_context('USERENV','NLS_CURRENCY') from dual;
--本地化的货币符,如人民币为¥,美元符为$
select sys_context('USERENV','NLS_DATE_FORMAT') from dual;
--当前使用的日期格式,一般中国为dd-mon-rr
select sys_context('USERENV','NLS_DATE_LANGUAGE') from dual;
--表示日期的语言,如中文简体SIMPLIFIED CHINESE
select sys_context('USERENV','NLS_TERRITORY') from dual;
--数据库服务器所在区域,如中国CHINA
select sys_context('USERENV','OS_USER') from dual;
--操作系统的用户名
select sys_context('USERENV','PROXY_USER') from dual;
--是否使用代理用户。否返回null
select sys_context('USERENV','PROXY_USERID') from dual;
--代理用户id
select sys_context('USERENV','SESSION_USER') from dual;
--当前认证的数据库用户名
select sys_context('USERENV','SESSION_USERID') from dual;
--当前认证的数据库用户名id
select sys_context('USERENV','SESSIONID') from dual;
--当前会话id
select sys_context('USERENV','TERMINAL') from dual;
--操作系统用户组
select sys_context('USERENV','IP_ADDRESS') from dual;
--当前会话主机ip
select sys_context('USERENV','HOST') from dual;
--当前会话主机操作系统名
除了oracle自带的sys_context函数,我们还可以自定义自身的上下文预定义函数。
怎么搞?
还可以自己定义上下文参数来传递值,下面是sys_context函数的使用格式:
sys_context(‘namespace’, ‘parameter’{, length});
namespace是存储信息的一个组单位,namespace是按照类别进行分类的。
一个namespace下可以有多个参数值,通过不同的parameter进行区分。
namespace是预先定义好的SQL标识符,而parameter是可以任意大小写非敏感的字符串,不超过30位长度。函数返回值为varchar2类型,长度默认为256位。
如果需要限制这个默认值,可以length参数作为新的返回长度值。
举例:
设置namespace指定parameter值,可以使用dbms_session.set_context,当然也可以自己写procedure:
1、定义namespace
create context Test using set_test_context;
2、定义方法
create or replace procedure set_test_context(value_01 in varchar2, value_02 in varchar2) is
begin
dbms_session.set_context(‘Test’, ‘a1’, value_01);
dbms_session.set_context(‘Test’, ‘a2’, value_02);
end;
– 3、设置值
exec set_test_context(‘A’,’B’);
– 4、获取值
select sys_context(‘Test’, ‘a1’) from dual;
SYS_CONTEXT(‘TEST’,‘A1’)
------------------------------------
A
select sys_context(‘Test’, ‘a2’) from dual;
SYS_CONTEXT(‘TEST’,‘A1’)
------------------------------------
B
文章结束。
以下为个人公众号,欢迎扫码关注:





