讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Oracle PL/SQL中调用HTTP接口?

千伟吖_7955

千伟吖_7955

发布时间:2026-08-07 09:50:20

|

994人浏览过

|

来源于php中文网

原创

UTL_HTTP调用总失败的主因是四层校验缺失:ACL权限未配(ORA-24247)、HTTPS未配置Wallet导致证书验证失败(ORA-29024)、字符集与响应读取方式错误、method/charset/Content-Length等参数设置不当。

如何在oracle pl/sql中调用http接口?

UTL_HTTP 是 Oracle 里调用 HTTP 接口的唯一原生方案,不依赖 Java 或外部工具。但直接用它容易出错——不是返回空、超时,就是权限报错 ORA-29273: HTTP request failed,甚至根本连不上。


为什么 UTL_HTTP 调用总失败?先查 ACL 权限

Oracle 11g 之后强制网络访问控制(ACL),没配 ACL 就算代码全对也会报 ORA-24247: network access denied by access control list (ACL)

检查和配置分三步:

  • 查当前用户是否有 connect 权限:SELECT * FROM dba_network_acl_privileges WHERE principal = 'YOUR_USER';
  • 查 ACL 是否已分配给目标主机:SELECT host, lower_port, upper_port FROM dba_network_acl_entries WHERE acl LIKE '%utl_http%';
  • 若无 ACL 或权限不足,需 DBA 执行(或你有 DBA 角色):
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
        acl         => '/sys/acls/utl_http.xml',
        description => 'HTTP access for UTL_HTTP',
        principal   => 'YOUR_USER',
        is_grant    => TRUE,
        privilege   => 'connect');
      DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
        acl         => '/sys/acls/utl_http.xml',
        host        => '*',
        lower_port  => 1,
        upper_port  => 65535);
    END;
    注意:host 设为 '*' 表示允许所有域名;生产环境建议精确到 'api.example.com'

    UTL_HTTP.BEGIN_REQUEST 的 method 和 charset 容易写错

    GET 请求最简方式是 UTL_HTTP.REQUEST(url),但它只支持 GET、返回 VARCHAR2、且长度上限 2000 字节(实际常截断)。真要可控,必须用 BEGIN_REQUEST + GET_RESPONSE 流式读取。

    常见错误点:

    • UTL_HTTP.SET_BODY_CHARSET('UTF-8') 必须在 BEGIN_REQUEST 之后、SET_HEADER 之前调用,否则 POST 时中文变乱码
    • POST 请求必须显式设 Content-Length,且值是字节长度(不是字符数):LENGTHB(p_data),不是 LENGTH(p_data)
    • Content-Type 值要匹配实际 payload:application/json 就不能写成 application/x-www-form-urlencoded
    • GET 参数拼接进 URL 后,整个 URL 需 URL 编码(Oracle 不自动编码),否则空格、中文会 400

    读取响应时别只用 READ_LINE

    UTL_HTTP.READ_LINE 只读一行,遇到大响应或二进制内容(如图片、PDF)会崩溃或丢数据。正确做法是循环 READ_RAW 并转 CLOB

    Agent Git Oracle
    Agent Git Oracle

    高级仓库分析与重构指南。基于AI推理识别技术债务与架构反模式。

    下载
    DECLARE
      req  UTL_HTTP.REQ;
      resp UTL_HTTP.RESP;
      buf  RAW(32767);
      clob_out CLOB;
    BEGIN
      req := UTL_HTTP.BEGIN_REQUEST('https://httpbin.org/get');
      resp := UTL_HTTP.GET_RESPONSE(req);
      DBMS_LOB.CREATETEMPORARY(clob_out, TRUE);
      BEGIN
        LOOP
          UTL_HTTP.READ_RAW(resp, buf, 32767);
          DBMS_LOB.WRITEAPPEND(clob_out, UTL_RAW.LENGTH(buf), UTL_RAW.CAST_TO_VARCHAR2(buf));
        END LOOP;
      EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN
        NULL;
      END;
      UTL_HTTP.END_RESPONSE(resp);
      DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(clob_out, 200, 1));
      DBMS_LOB.FREETEMPORARY(clob_out);
    END;

    注意:READ_RAWREAD_TEXT 更安全,避免字符集转换错误;CLOB 才能容纳完整响应(最大 4GB)。

    HTTPS 请求必须配 Oracle Wallet

    https:// 时,UTL_HTTP 默认要求 Oracle Wallet 包含可信 CA 证书。没配就会报 ORA-29273: HTTP request failed + ORA-29024: Certificate validation failure

    解决路径只有两条:

    • 临时绕过验证(仅测试用):UTL_HTTP.SET_WALLET(''); —— 但 Oracle 12cR2+ 已禁用空 wallet,必须用 UTL_HTTP.SET_TRANSFER_TIMEOUT(60) + UTL_HTTP.SET_FOLLOW_REDIRECT(FALSE) 辅助定位问题
    • 正式环境必须创建 wallet:
      orapki wallet create -wallet /path/to/wallet -auto_login
      orapki wallet add -wallet /path/to/wallet -dn "CN=*.example.com" -trusted_cert -cert /path/to/cert.pem
      然后在 PL/SQL 中:UTL_HTTP.SET_WALLET('file:/path/to/wallet', 'wallet_password');

    Wallet 路径必须数据库服务器本地可读,且 Oracle 进程有权限访问文件系统目录。

    真正麻烦的从来不是怎么写请求,而是权限、字符集、响应体类型、SSL 信任链这四层嵌套校验。漏掉任意一层,UTL_HTTP 就静默失败或返回不可靠结果。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

821

2023.08.16

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2233

2023.09.15

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2250

2023.09.18

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

1309

2023.09.19

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

1893

2023.09.19

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2429

2023.09.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4009

2023.11.02

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

237

2023.11.08

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn