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
相关产品推荐
相关产品推荐

