上次分享中曾使用了SYS_CONTEXT函数获取ip地址,但返回值为空,当时认为其是返回ipv6的地址,所以为空,但其实这是错误的结论。虽然是一个小小的知识点,但从中可以看出Oracle对于这种内置函数的考虑非常周到,我们先看如下是返回空的ip地址的一个示例,

我们首先看看SYS_CONTEXT函数的定义,

这个函数有两个入参,第一个值是命名空间,取值可以是“USERENV”或“SYS_SESSION_ROLES”,第二个值是一些列属性,例如我们使用的IP_ADDRESS,

含义是,

IP address of the machine from which the client is connected. If the
client and server are on the same machine and the connection uses IPv6 addressing, then ::1 is returned.

返回的是客户端连接的机器IP,如果客户端和服务器是同机,则连接会使用IPv6地址,::1会返回。

MOS这篇文章说明了这个问题,

SYS_CONTEXT(‘USERENV’, ‘IP_ADDRESS’) Function Returns A Null Value (文档ID 470504.1)

主要意思就是如果客户端没用使用TCP协议(也就是使用tnsnames.ora定义的连接串)连接,不会返回IP地址,

IP address is not available if client is not connecting through TCP (@SID).

可以看出使用了@SID,则返回了本机IP地址,

和SYS_CONTEXT函数有联系的还有这两篇文章,

SYS_CONTEXT (‘USERENV’, ‘IP_ADDRESS’) Returns Hostname Rather Than Client IP (文档 ID 1267855.1)

若使用了11.2.0.x的监听器访问10.2.0.4,则返回的是主机名,不是IP地址。解决方案就是,

1) Use IP address and not hostname in the Oracle 11 listener address.
2) When using a hostname contain the listen protocol address by using (IP=FIRST), (IP=V4_ONLY) or (IP=V6_ONLY).
Working listener address examples:
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)(IP=FIRST))
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)(IP=V4_ONLY))
(ADDRESS = (PROTOCOL = TCP)(HOST = IP_address)(PORT = 1521))

另一篇文章是,

SYS_CONTEXT(‘USERENV’,’IP_ADDRESS’) Doesn’T Return Ipv4 Address When Ipv6 is Enabled (文档 ID 1175504.1)

使用11.1.0.7的监听器查询的时候,例如IPv4是10.16.120.165,则返回是”::ffff:10.16.120.165”,原因就是11.1版本不支持IPv6,无法做转换,解决方案是,

1) Disable IPV6 at OS level
2) Upgrade the database from 11.1.0.7.0 to 11.2.0.1.0

总结:
Oracle中几乎所有细节,其实都有可能蕴含着一些特殊含义或用法,足以见其设计的精妙,唯有持续积累,才能收获更多。

欢迎关注我的个人微信公众号:bisal的个人杂货铺

SYS_CONTEXT函数返回IP地址的一些误解相关推荐

  1. php验证ip地址的函数,php使用preg_match()函数验证ip地址的方法

    本文实例讲述了php使用preg_match()函数验证ip地址的方法.分享给大家供大家参考,具体如下: 代码一.正则实现preg_match("/^(?:25[0-5]|2[0-4]d|1 ...

  2. 利用函数进行ip地址转换

    inet_addr.inet_ntoa.inet_pton.inet_ntop用法 inet_addr(): inet_ntoa(): inet_pton(): inet_ntop(): 运行实例 1 ...

  3. ip地址转换数字函数 iton_3. IP地址转换函数

    一.字符串表示的IP地址需要被转化为整数(二进制数)方能使用 IPv4地址:点分十进制字符串 IPv6地址:十六进制字符串 有时(如记录日志),我们则要把整数(二进制数)表示的IP地址转化为可读的字符 ...

  4. ip地址转换数字函数 iton_esp8266 inet_ntoa函数实现 ip地址转换为字符串 MAC地址转字符串...

    esp8266芯片可作为mcu,功能很强大,但与传统mcu相比,可用资源实在不多,连浮点数都不支持 IP地址转字符创函数inet_ntoa很方便,但8266中没有!!!!! 本节将讲述如何自己实现in ...

  5. python中的map函数返回一个地址_python中的map函数

    1.对可迭代函数'iterable'中的每一个元素应用'function'方法,将结果作为list返回. 来个例子: >>> def add100(x): ... return x+ ...

  6. 字符串 IP 地址和二进制 IP 地址的转换

    目录 inet_xxx() 函数 1. inet_aton()函数 2. inet_addr()函数 3. inet_network()函数 4. inet_ntoa()函数 5. inet_make ...

  7. gethostbyname()函数:通过域名获取IP地址

    客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误. 而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换 IP 地址时修 ...

  8. php ip处理函数,PHP取ip地址函数

    从thinkphp3.2中提取出来的取请求ip地址的函数/** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @par ...

  9. ip地址互转十进制数字(函数)

    原IP:192.168.32.1 转换为16进制:192->c0 168->a8 32->20 1->01 16进制结果:c0 a8 20 01 将16进制结果组合转换为10进 ...

最新文章

  1. 基于 CODING 轻松搞定持续集成
  2. 不同制式字符串之间的转换
  3. dos如何修改远程服务器的密码,dos命令登入远程服务器
  4. 全国首个人工智能专业,怎么学?
  5. Linux 下rpm包搭建LAMP环境
  6. python并行计算_Python并行计算初探
  7. TCL_事务控制语言
  8. hdu 2883 kebab 网络流
  9. python新手入门代码-介绍十个Python小案例,新手入门就在这里
  10. C++11中移动语义(std::move)和完美转发(std::forward)
  11. Git学代码之学会运行别人的代码
  12. Android ROS开发环境搭建
  13. 【计算理论】图灵机 ( 图灵机设计 )
  14. TypeScript学习--Symbols
  15. HTTP协议与HTTPS协议详解(含常见面试题)
  16. Wireshark数据包分析
  17. 法国敏捷开发与敏捷测试模式
  18. git bash返回上一级目录
  19. N32926 usb gadget 加 adb驱动, 插入USB线一点反应都没有。
  20. [渝粤教育] 南京信息工程大学 会计学 参考 资料

热门文章

  1. python项目报告书_python项目
  2. 计算机顶级会议培训,计算机视觉顶级会议ICCV 2017 腾讯优图入选12篇论文
  3. 用java做小学数学系统_小学生数学练习题目自动生成系统——java课程设计
  4. 课题十 加工中心的编程技巧
  5. 【计算机网络-2】 【第一章】SDU与PDU 笔记
  6. 用::after写背景
  7. Axure RP原型发布到公司服务器
  8. 原VIPKID研发副总裁朱会离职
  9. 日撸 Java 三百行(81-90天,CNN 卷积神经网络)
  10. 新手如何运营推广微信公众号