如何在PLSQL中获取Oracle服务的IPv4格式IP地址
解决方案
原方案失效原因说明
DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS);未指定参数时默认取数据库服务器主机名的解析结果,若服务器操作系统IPv6解析优先级高于IPv4,就会返回IPv6格式地址select SYS_CONTEXT('USERENV', 'IP_ADDRESS') ipaddr from dual获取的是当前数据库连接的客户端IP,你从本地启动PL/SQL发起连接自然返回localhost,完全不是服务端地址
可用方案
方案1:遍历主机解析结果筛选IPv4(推荐,权限要求低)
需要你的账号有UTL_INADDR包的执行权限,执行以下PL/SQL代码即可:
DECLARE v_hostname VARCHAR2(100); v_ipv4 VARCHAR2(50); BEGIN -- 获取数据库服务器主机名 v_hostname := UTL_INADDR.GET_HOST_NAME(); -- 遍历主机对应的所有解析地址,筛选IPv4格式 FOR addr_rec IN (SELECT COLUMN_VALUE addr FROM TABLE(UTL_INADDR.GET_HOST_ADDRESSES(v_hostname))) LOOP IF REGEXP_LIKE(addr_rec.addr, '^\d{1,3}(\.\d{1,3}){3}$') THEN v_ipv4 := addr_rec.addr; EXIT; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE('Oracle服务端IPv4地址:'||v_ipv4); END; /
如果提示没有UTL_INADDR的执行权限,联系DBA执行以下语句授权即可:GRANT EXECUTE ON SYS.UTL_INADDR TO 你的账号名;
如果服务器绑定了多个IPv4地址,删除代码中的EXIT即可返回所有可用的IPv4地址。
方案2:通过系统视图查询(需要对应视图访问权限)
如果你的账号有权限查询v$instance等系统视图,可以用以下SQL直接查询:
WITH host_info AS ( SELECT host_name FROM v$instance ) SELECT COLUMN_VALUE service_ipv4 FROM host_info, TABLE(UTL_INADDR.GET_HOST_ADDRESSES(host_info.host_name)) WHERE REGEXP_LIKE(COLUMN_VALUE, '^\d{1,3}(\.\d{1,3}){3}$') FETCH FIRST 1 ROW ONLY;
如果需要返回所有绑定的IPv4,删除FETCH FIRST 1 ROW ONLY即可。
方案3:查询对外服务的监听IP
如果需要获取数据库对外提供服务的实际监听IP(非服务器内部网卡地址),可以用以下SQL查询:
SELECT REGEXP_SUBSTR(listener_address, 'HOST=([0-9.]+)', 1, 1, NULL, 1) service_ipv4 FROM v$listener_network WHERE REGEXP_LIKE(listener_address, 'HOST=([0-9.]+)') FETCH FIRST 1 ROW ONLY;
内容的提问来源于stack exchange,提问作者david.gao
相关产品推荐
相关产品推荐

