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

调用HTTPS API时遇ORA-2973与ORA-28759错误求助

问题:调用HTTPS API时触发ORA-2973与ORA-28759错误

尝试调用https://abc.io/api/connectivity的GET接口,已完成前置操作:添加证书、创建Oracle Wallet、配置ACL、授予用户UTL_HTTP权限,但执行存储过程时仍报错:

ORA-2973 HTTP request failed, ORA-28759 failure to open file error.

关联函数代码如下:

create or replace function GET_API_DATA
  return varchar2 is
  s_entire_msg clob;
  s_msg        varchar2(80);
  s_url        varchar2(32000);
  s_req        utl_http.req;
  s_resp       utl_http.resp;
  f_result     varchar2(32000);
  v_result     varchar2(20000);
begin


  s_url  := 'https://api.uat/api/connectivity';
  UTL_HTTP.set_wallet('file:c:\wallet', 'Oracle_1234');
  s_req  := utl_http.begin_request(s_url,'GET',null, null, 'ap-hostname');
  s_resp := utl_http.get_response(r => s_req);

  BEGIN
    LOOP
      utl_http.read_text(r => s_resp, data => s_msg);
      s_entire_msg := s_entire_msg || s_msg;
    END LOOP;
  EXCEPTION
    when utl_http.end_of_body THEN
      utl_http.end_response(s_resp);
    WHEN others THEN
      utl_tcp.close_all_connections;
  END;

  apex_json.parse(s_entire_msg);
  v_result := apex_json.get_varchar2(p_path => 'status');
  f_result := v_result;

  return f_result;

EXCEPTION
  when no_data_found then
    null;
end;

排查与解决方案

1. 优先解决Wallet文件访问问题(ORA-28759核心原因)

ORA-28759本质是Oracle数据库进程无法读取指定的Wallet目录/文件,重点检查:

  • 路径真实性:确认数据库服务器上c:\wallet目录存在,且包含ewallet.p12、cwallet.sso等Wallet文件(注意:这里的路径是服务器端路径,不是本地客户端路径)。
  • 权限配置:确保Oracle数据库服务运行的系统用户(如Windows下的OracleService<SID>)对该目录及文件有读取权限,避免因权限不足导致无法打开。
  • 路径格式:Windows环境下建议用正斜杠或双反斜杠,比如file:c:/wallet或file:c:\\wallet,防止单斜杠转义问题。

2. 验证Wallet有效性

  • 用Oracle自带工具orapki检查Wallet内容,确认包含目标API的完整证书链:
    orapki wallet display -wallet c:\wallet
    
  • 核对Wallet密码Oracle_1234是否正确,密码错误会直接导致无法加载Wallet;如果是自动登录型Wallet(有cwallet.sso文件),可以尝试省略密码参数:
    UTL_HTTP.set_wallet('file:c:\wallet');
    

3. 修正代码中的潜在错误

  • URL笔误:代码中s_url写的是https://api.uat/api/connectivity,但你实际要调用的是https://abc.io/api/connectivity,需修正URL后测试。
  • 代理参数误用:utl_http.begin_request的第5个参数是代理服务器地址,如果你没有使用代理,应该移除该参数,改为:
    s_req := utl_http.begin_request(s_url, 'GET');
    

4. 二次确认ACL与网络连通性

  • 检查ACL是否允许访问目标主机及端口:
    -- 查看已配置的ACL规则
    SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
    -- 查看用户权限
    SELECT principal, privilege, is_granted FROM dba_network_acl_privileges;
    
  • 在数据库服务器上直接测试网络连通性,比如用curl访问目标API,确认网络层面没有问题。

内容的提问来源于stack exchange,提问作者Mohammad Ubaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:43:19