VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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代码。