PLSQL通过utl_http调用REST API返回ORA-29273错误如何解决
错误原因
ORA-29259 end-of-input reached 配合HTTPS请求出现,绝大多数情况都是HTTPS TLS握手失败导致的,你调用的接口是HTTPS协议,UTL_HTTP默认不直接支持HTTPS,需要额外配置两个核心依赖:
- Oracle钱包,存储目标站点的根CA证书
- 给当前数据库用户开通UTL_HTTP访问目标站点的ACL权限
解决步骤
1. 配置Oracle钱包
首先导出api.wheretheiss.at站点的根CA证书(PEM格式),然后在数据库服务器上用orapki工具创建钱包并导入证书:
# 创建钱包,按提示输入钱包密码,-auto_login表示无需密码可自动读取钱包 orapki wallet create -wallet /数据库服务器上的钱包存储目录 -pwd 你的钱包密码 -auto_login # 导入下载好的站点根CA证书 orapki wallet add -wallet /数据库服务器上的钱包存储目录 -pwd 你的钱包密码 -trusted_cert -cert /根证书存储路径/root_ca.cer
注意:确保Oracle运行用户对钱包存储目录有读权限
2. 配置ACL网络访问权限
用SYS用户执行以下命令,给你的业务数据库用户开通访问目标站点443端口的权限:
BEGIN DBMS_NETWORK_ACL_ADMIN.append_host_ace ( host => 'api.wheretheiss.at', lower_port => 443, upper_port => 443, ace => xs$ace_type(privilege_list => xs$name_list('connect'), principal_name => '你的业务数据库用户名', principal_type => xs_acl.ptype_db)); END; /
3. 修正PLSQL代码
在原有代码基础上增加钱包配置、标准请求头设置,完整代码如下:
declare l_url varchar2(32767) := 'https://api.wheretheiss.at/v1/satellites/25544'; l_http_request utl_http.req; l_http_response utl_http.resp; l_text varchar2(32767); begin -- 新增:配置钱包,路径前缀必须加file:,auto_login钱包密码可填空字符串 utl_http.set_wallet('file:/数据库服务器上的钱包存储目录', ''); l_http_request := utl_http.begin_request(l_url); -- 新增:明确请求方法、接受的返回类型,避免服务端拦截 utl_http.set_method(l_http_request, 'GET'); utl_http.set_header(l_http_request, 'Accept', 'application/json'); l_http_response := utl_http.get_response(l_http_request); -- 可选:打印响应状态码方便排查问题 dbms_output.put_line('响应状态码:'||l_http_response.status_code); begin loop utl_http.read_text(l_http_response, l_text, 32766); dbms_output.put_line(l_text); end loop; exception when utl_http.end_of_body then utl_http.end_response(l_http_response); end; exception when others then utl_http.end_response(l_http_response); raise; end; /
前置排查
如果配置完成仍报错,可以先在数据库服务器上执行curl命令验证网络连通性,确认没有防火墙、代理拦截:
curl https://api.wheretheiss.at/v1/satellites/25544
内容的提问来源于stack exchange,提问作者Superdooperhero
相关产品推荐
相关产品推荐

