UTL_HTTP
功能描述
使用UTL_HTTP包可通过SQL和过程语言调用超文本传输协议HTTP,允许通过HTTP访问internet上的数据。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
使用该内置包的功能需要提前创建plpython3u插件,步骤参考python3环境配置。
Vastbase不支持wallet相关参数,因此无法使用https进行访问。
类型说明
req类型
功能描述
req用于接受http的request请求。
语法格式
TYPE req RECORD(
url VARCHAR2(32767),
method VARCHAR2(64),
http_version VARCHAR2(64),
);
参数说明
url:http请求的URL,在BEGIN_REQUEST进行设置。
method:请求url的方法,在BEGIN_REQUEST进行设置。
http_version:发送请求的http协议版本。
resp类型
功能描述
使用resp的记录表示http的响应。
语法格式
TYPE resp RECORD(
status_code PLS_INTEGER,
reason_phrase VARCHAR2(256),
http_version VARCHAR2(64),
);
参数说明
- url:http请求的URL,在BEGIN_REQUEST进行设置。
- method:请求url的方法,在BEGIN_REQUEST进行设置。
- http_version:发送请求的http协议版本。
使用流程
1.定义http.req和http.resp变量。
2.设置http超时时间。
3.进行url编码,设置header,设置body字符集。
4.获取request请求。
5.获取response。
6.异常处理。
子程序
该内置包包含以下子程序:
子程序 | 描述 |
---|---|
SET_TRANSFER_TIMEOUT | 设置UTL_HTTP从WEB服务器或代理服务器读取HTTP响应的超时值。 |
REQUEST | 从指定的URL请求检索数据。可直接用于SQL查询。 |
BEGIN_REQUEST | 开始一个新的HTTP请求。 |
SET_HEADER | 用于设置http请求头。 |
GET_RESPONSE | 用于读取http响应。 |
SET_BODY_CHARSET | Content-Type标头中未指定字符集时,设置请求体的字符集。 |
WRITE_TEXT | 在HTTP请求体中写入一些文本数据。 |
READ_LINE | 以文本形式读取http响应正文,直到到达尾行。 |
END_RESPONSE | 结束HTTP响应,完成HTTP请求和响应。 |
END_REQUEST | 结束HTTP请求。 |
GET_DETAILED_SQLERRM | 检索最后引发的异常的详细SQLERRM。 |
SET_TRANSFER_TIMEOUT
语法格式
UTL_HTTP.SET_TRANSFER_TIMEOUT(timeout);
参数说明
timeout:网络传输超时值(以秒为单位)。
REQUEST
语法格式
UTL_HTTP.REQUEST(url);
参数说明
url:请求的url地址。
注意事项
不支持参数如下:
proxy
wallet_path
wallet_password
https_host
BEGIN_REQUEST
语法格式
UTL_HTTP.BEGIN_REQUEST(r);
参数说明
r:http请求的URL。
SET_HEADER
语法格式
UTL_HTTP.SET_HEADER(r,name,value);
参数说明
- r:http请求。
- name:http的header名称。
- value:http的header值。
GET_RESPONSE
语法格式
UTL_HTTP.GET_RESPONSE(r);
参数说明
r:http响应。
SET_BODY_CHARSET
语法格式
UTL_HTTP.SET_BODY_CHARSET(r,charset);
参数说明
r:http响应。
charset:正文的字符集。
WRITE_TEXT
语法格式
UTL_HTTP.WRITE_TEXT(r,date);
参数说明
- r:http请求。
- date:需要在HTTP请求body正文中发送的文本数据。。
READ_LINE
语法格式
UTL_HTTP.READ_LINE(r,date,crlf);
参数说明
- r:http响应。
- date:http的body文本。
- crlf:是否删除换行符。
END_RESPONSE
语法格式
UTL_HTTP.END_RESPONSE(r);
参数说明
r:http响应。
END_REQUEST
语法格式
UTL_HTTP.END_REQUEST(r);
参数说明
r:http请求。
GET_DETAILED_SQLERRM
语法格式
UTL_HTTP.GET_DETAILED_SQLERRM
RETURN VARCHAR2;
示例
1、系统已经安装python3环境。
2、创建plpython3u插件。
create extension plpython3u;
3、使用UTL_HTTP包创建函数。
CREATE OR REPLACE FUNCTION FN_HTTP_GET (v_url VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
res record;
value varchar2;
v_text text;
BEGIN
v_text := '';
BEGIN
req := UTL_HTTP.BEGIN_REQUEST( url => v_url, method => 'GET' );
UTL_HTTP.SET_BODY_CHARSET(req, 'UTF-8');
UTL_HTTP.SET_HEADER(req, 'Content-Type', 'text/html');
resp := UTL_HTTP.GET_RESPONSE( req );
LOOP
UTL_HTTP.READ_LINE( resp, value, TRUE );
--value:=res.data;
v_text := v_text || value;
END LOOP;
UTL_HTTP.END_RESPONSE( resp );
EXCEPTION
WHEN "utl_http.end_of_body" THEN
UTL_HTTP.END_RESPONSE( resp );
WHEN OTHERS THEN
RAISE EXCEPTION '(%)', SQLERRM;
UTL_HTTP.END_RESPONSE(resp);
END;
return v_text;
END;
END;
/
4、删除插件。
drop extension plpython3u;
5、调用函数。
select FN_HTTP_GET('http://172.16.19.135/reviewboard/r/ ');
返回结果报错,utl_http模式不存在。
6、重新创建拓展。
create extension plpython3u;
7、调用函数。
select FN_HTTP_GET('http://172.16.19.135/reviewboard/r/ ');
调用成功,返回对应的html代码。