如何从 PL/SQL 过程中访问 http URL?

Posted

技术标签:

【中文标题】如何从 PL/SQL 过程中访问 http URL?【英文标题】:How to hit a http URL from PL/SQL procedure? 【发布时间】:2017-01-23 13:33:46 【问题描述】:

Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产

我正在创建一个 Oracle 作业,我需要每 30 分钟执行一次程序,

在程序内部,我想点击一个 HTTP URL,以便在后面执行一个 java 程序。

方法:

declare 
 req   UTL_HTTP.REQ;
BEGIN
 req := UTL_HTTP.BEGIN_REQUEST('http://dev.xxx.com/yyy/zzz/aaa/triggerJob');
 dbms_output.put_line('hitting');
EXCEPTION
 WHEN UTL_HTTP.END_OF_BODY THEN
    dbms_output.put_line('exception');
END;

DBMS OUTPUT 命中

-- 但实际上并没有击中!

方法 2

declare 
 req   UTL_HTTP.REQ;
 resp  UTL_HTTP.RESP;
BEGIN
 req := UTL_HTTP.BEGIN_REQUEST('http://dev.xxx.com/yyy/zzz/aaa/triggerJob');
 UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
 resp := UTL_HTTP.GET_RESPONSE(req);
UTL_HTTP.END_RESPONSE(resp);
 dbms_output.put_line('hitting');

EXCEPTION
 WHEN UTL_HTTP.END_OF_BODY THEN
    dbms_output.put_line('exception');
END;

有了这个,我在执行时遇到了错误。

【问题讨论】:

您使用的是哪个版本的 Oracle?您是否授予了相关的访问权限? @APC Oracle Database 12c 企业版,是的,我拥有所有权限。读/写/更新/插入和 ACL 也是如此。 大概你已经测试了通过一些普通的网络服务机制,SOAPUI 向 URL 发送一个 GET 请求? @APC 我在浏览器“dev.xxx.com/yyy/zzz/aaa/triggerJob”中点击 URL,它绝对可以正常工作。 @APC 任何线索。 【参考方案1】:

考虑添加get_response 来实际执行请求;否则它只准备好了;);另一个好的做法是设置 http 标头...

declare 
 req   UTL_HTTP.REQ;
BEGIN
 req := UTL_HTTP.BEGIN_REQUEST('http://dev.xxx.com/yyy/zzz/aaa/triggerJob');
 UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
 UTL_HTTP.GET_RESPONSE(req);

 dbms_output.put_line('hitting');

EXCEPTION
 WHEN UTL_HTTP.END_OF_BODY THEN
    dbms_output.put_line('exception');
END;

更多内容在Oracle documentation

【讨论】:

请在上述更新的问题中检查方法 2(由您建议)。 所以这意味着你必须打开另一个问题。第一个问题是解决。现在你必须做一些事情来让你的数据库能够访问远程服务器(是真的http,还是https??) 是 HTTP:// 请求。

以上是关于如何从 PL/SQL 过程中访问 http URL?的主要内容,如果未能解决你的问题,请参考以下文章

从 PL/SQL 函数访问查询的 from 子句中的表名

如何从替换过程(PL/SQL)中获取旧代码?

如何从 pl sql 过程运行 sql 脚本

PL/SQL编程_概述

如何从 Oracle 10G PL/SQL 函数和过程中查找所有表引用? [复制]

如何检查 ref 游标是不是从 pl/sql 过程返回数据