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

Oracle数据库用PL/SQL的UTL_HTTP调用REST服务超时求助

使用UTL_HTTP调用REST API时遇到ORA-29273/ORA-12535错误的排查与配置建议

在Oracle数据库中通过PL/SQL使用UTL_HTTP发送GET请求调用REST API时触发超时错误,以下是问题代码、报错信息及排查配置建议:

问题代码

DECLARE
    login         INTEGER DEFAULT 0;
    sec           INTEGER DEFAULT 0;
    req           utl_http.req;
    resp          utl_http.resp;
    l_clob        CLOB;
    l_text        VARCHAR2(32767 CHAR);
    l_key         VARCHAR2(550);
    l_dg          CHAR(50);
    l_url         VARCHAR2(200);
    l_host        VARCHAR2(550);
    l_port        NUMBER;
    l_user        VARCHAR2(550);
    l_passwd      VARCHAR2(550);
    l_wallet_path VARCHAR2(550);
    l_wallet_pwd  VARCHAR2(550);

BEGIN

    l_wallet_path := '/tmp/wallet';
    l_wallet_pwd := 'sample_tes123';
    l_url := 'https://rest api // sample test';
    l_accesskey := 'asefevhefvfvkfekv;efv;';
    utl_http.set_wallet(l_wallet_path, l_wallet_pwd);
    dbms_output.put_line('wallet set');
    req := utl_http.begin_request(l_url, 'GET', utl_http.http_version_1_1);
    dbms_output.put_line(l_url);
    /* Stablish the Authentication */               
    --utl_http.set_authentication( req ,l_datagroup ,l_accesskey);
    utl_http.set_header(req, 'Authorization', l_accesskey);
    utl_http.set_header(req, 'login', 0);
    utl_http.set_header(req, 'sec', 0);
    utl_http.set_header(req, 'VIN', '12345');
    dbms_output.put_line('header set');
    resp := utl_http.get_response(req);
    IF resp.status_code != 200 THEN
        utl_http.end_response(resp);
        utl_http.end_request(req);
        RETURN;
    END IF;

    BEGIN
        dbms_lob.createtemporary(l_clob, TRUE);
        LOOP
            utl_http.read_text(resp, l_text, 1000);
            dbms_output.put_line(l_text || chr(10));
            dbms_lob.writeappend(l_clob, length(l_text), l_text);
            l_text := NULL;
        END LOOP;

    EXCEPTION
        WHEN utl_http.end_of_body THEN
            utl_http.end_response(resp);
            utl_http.end_request(req);
            dbms_output.put_line('error!!!');
        WHEN OTHERS THEN
            dbms_output.put_line('error!!!');
            RETURN;
    END;

EXCEPTION
    WHEN utl_http.end_of_body THEN
        utl_http.end_response(resp);
        utl_http.end_request(req);
        dbms_output.put_line('error!!!');
    WHEN OTHERS THEN
        ROLLBACK;
        utl_http.end_response(resp);
        utl_http.end_request(req);
        dbms_output.put_line('error!!!' || sqlerrm);
END;
/

中文报错信息

ORA-29273: HTTP请求失败
ORA-06512: 位于"SYS.UTL_HTTP", line 1530
ORA-12535: TNS:操作超时
ORA-06512: 位于"SYS.UTL_HTTP", line 380
ORA-06512: 位于"SYS.UTL_HTTP", line 1470
ORA-06512: 位于line 1
29273. 00000 - "HTTP请求失败"

排查与配置建议

  • 修正无效URL:代码中l_url为测试用无效地址,替换为真实、格式正确的REST API端点(无空格、路径合法)。
  • 验证网络连通性:
    • 在数据库服务器上用curl/wget测试目标API的连通性,确认无防火墙、安全组拦截。
    • 用nslookup/ping验证目标域名解析正常。
  • 检查UTL_HTTP权限与配置:
    • 确保数据库用户已被授权:GRANT EXECUTE ON UTL_HTTP TO your_user;
    • 若需代理访问,添加代理配置:utl_http.set_proxy('proxy_host:proxy_port');
    • 验证钱包配置:确认/tmp/wallet路径存在且Oracle进程有读取权限,钱包包含目标API的根证书(可通过orapki工具验证)。
  • 调整超时参数:添加超时设置避免请求超时:utl_http.set_transfer_timeout(30);(单位:秒)。
  • 优化代码逻辑:
    • 补充l_accesskey的变量声明:l_accesskey VARCHAR2(550);
    • 按API要求修正Authorization头格式,例如添加认证类型:utl_http.set_header(req, 'Authorization', 'Bearer ' || l_accesskey);
    • 确保异常分支中正确释放请求/响应资源,避免泄漏。

内容的提问来源于stack exchange,提问作者Shri Nivi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:26