You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:08