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

使用APEX_WEB_SERVICE从带Basic Auth的外部URL获取XML至Oracle表的问题

问题修复与批量处理操作指南

一、单个URL问题排查与修复

1. 基础连通性验证

  • 从抛出ORA-29273错误的主机执行 ping deda1w6114,确认目标主机可达
  • 执行 telnet deda1w6114 18080 验证端口开放状态,若telnet不可用,用PowerShell命令 Test-NetConnection deda1w6114 -Port 18080 替代
  • 若连通性异常,优先联系运维团队修复网络或端口映射问题

2. HTTP/SSL协议确认

  • 在浏览器直接访问原URL(不带凭据),查看认证弹窗类型:
    • 若为Windows集成身份验证(NTLM/Kerberos),则当前HTTP协议无需调整
    • 若提示证书错误,再尝试将URL中的http改为https,端口对应调整为443(先单URL测试)

3. ORA-29273错误修复

该错误核心是Oracle UTL_HTTP请求失败,按以下步骤处理:

  • 临时无硬编码测试:用UTL_HTTP内置身份验证方法替代URL中的明文凭据:
    DECLARE
      req UTL_HTTP.REQ;
      resp UTL_HTTP.RESP;
      buffer VARCHAR2(4000);
    BEGIN
      req := UTL_HTTP.BEGIN_REQUEST('http://deda1w6114:18080/discoverant-ws/agdata/agmanifest/');
      UTL_HTTP.SET_AUTHENTICATION(req, 'USERID', 'PASSWORD', 'NTLM'); -- 适配Windows凭据
      resp := UTL_HTTP.GET_RESPONSE(req);
      LOOP
        UTL_HTTP.READ_LINE(resp, buffer);
        DBMS_OUTPUT.PUT_LINE(buffer);
      END LOOP;
      UTL_HTTP.END_RESPONSE(resp);
    EXCEPTION
      WHEN OTHERS THEN
        UTL_HTTP.END_RESPONSE(resp);
        RAISE;
    END;
    /
    
  • 若上述代码执行成功,说明问题在于Oracle无法解析URL中的凭据格式,改用UTL_HTTP身份验证方法即可
  • 检查Oracle权限:确保执行用户拥有UTL_HTTP执行权限,若需代理访问,提前配置UTL_HTTP.SET_PROXY

二、避免硬编码凭据的方案

1. Oracle Wallet存储凭据

  • 创建Wallet并存储凭据:
    mkstore -wrl /path/to/your/wallet -create
    mkstore -wrl /path/to/your/wallet -createCredential deda1w6114:18080 USERID PASSWORD
    
  • PL/SQL中读取Wallet凭据:
    DECLARE
      req UTL_HTTP.REQ;
      resp UTL_HTTP.RESP;
      username VARCHAR2(100);
      password VARCHAR2(100);
    BEGIN
      UTL_HTTP.SET_WALLET('file:/path/to/your/wallet');
      UTL_HTTP.GET_CREDENTIAL('deda1w6114:18080', username, password);
      req := UTL_HTTP.BEGIN_REQUEST('http://deda1w6114:18080/discoverant-ws/agdata/agmanifest/');
      UTL_HTTP.SET_AUTHENTICATION(req, username, password, 'NTLM');
      -- 后续XML处理逻辑
      UTL_HTTP.END_RESPONSE(resp);
    END;
    /
    

2. 操作系统环境变量读取

  • 在Oracle服务器操作系统中设置环境变量(如AGDATA_USER、AGDATA_PASS)
  • PL/SQL中读取环境变量:
    DECLARE
      req UTL_HTTP.REQ;
      resp UTL_HTTP.RESP;
      username VARCHAR2(100);
      password VARCHAR2(100);
    BEGIN
      username := UTL_ENV.GET_ENV('AGDATA_USER');
      password := UTL_ENV.GET_ENV('AGDATA_PASS');
      req := UTL_HTTP.BEGIN_REQUEST('http://deda1w6114:18080/discoverant-ws/agdata/agmanifest/');
      UTL_HTTP.SET_AUTHENTICATION(req, username, password, 'NTLM');
      -- 后续XML处理逻辑
      UTL_HTTP.END_RESPONSE(resp);
    END;
    /
    
    注:需确保执行用户拥有读取环境变量的权限

三、批量推广至64个URL

  1. 整理所有URL到Oracle表(如AGDATA_URLS,包含URL_ID、URL、HOST_PORT字段)
  2. 编写PL/SQL存储过程,循环读取表中URL,复用上述身份验证逻辑
  3. 加入错误捕获模块,记录每个URL的处理结果(成功/失败原因),便于后续排查
  4. 先测试10个左右的URL,确认无问题后再全量执行

内容的提问来源于stack exchange,提问作者Anshul Ayushya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:57:10