暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

知识篇 | Oracle之环境上下文信息的预定义函数sys_context介绍

原创 杨磊 2021-03-24
2552

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

文章结束。

以下为个人公众号,欢迎扫码关注:
image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论