Oracle通过procedure调用webservice接口
-- 声明变量和数据类型
declare
req utl_http.req; -- HTTP请求句柄
resp utl_http.resp; -- HTTP响应句柄
url varchar2(4000) := 'http://10.xx.xx.xx:8085/WebService.asmx'; -- Web Service的URL地址
soap_env varchar2(4000); -- SOAP请求包体
buffer varchar2(32767); -- 字符串缓冲区
utf8_data clob; -- 存储UTF-8编码的CLOB数据类型(存储大量文本数据的数据类型)
raw_data raw(32767); -- RAW数据类型,用于存储二进制数据
raw_buffer raw(32767); -- RAW类型的缓冲区
line varchar2(32767); -- 每行读取的数据
idx integer := 1; -- 循环索引变量
begin
-- 构造SOAP请求包体
soap_env :=
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">' ||
'<soap:Header/>' || -- SOAP头,这里为空
'<soap:Body>' || -- SOAP主体开始
' <tem:testProcedure>' || -- 调用Web Service的方法名
' <tem:sInput>' || -- 方法参数开始
' testConnect + 中文test' || -- 参数值,包括英文和中文字符
'</tem:sInput>' || -- 方法参数结束
' </tem:testProcedure>' || -- 方法调用结束
'</soap:Body>' || -- SOAP主体结束
'</soap:Envelope>'; -- SOAP包体结束
-- 开始发起HTTP POST请求,如果此部分存在疑问,请自行寻找前端请求报文相关内容学习。
req := utl_http.begin_request(url, 'POST', 'HTTP/1.1'); -- 初始化HTTP请求
utl_http.set_header(req, 'Content-Type', 'application/soap+xml; charset=utf-8'); -- 设置Content-Type头部
utl_http.set_header(req, 'Content-Length', length(soap_env)); -- 设置Content-Length头部
utl_http.write_text(req, soap_env); -- 写入SOAP请求包体到HTTP请求
-- 获取HTTP响应
resp := utl_http.get_response(req); -- 获取HTTP响应句柄
dbms_lob.createtemporary(utf8_data, true); -- 创建临时CLOB变量用于存储响应数据
-- 循环读取HTTP响应体
loop
begin
utl_http.read_raw(resp, raw_buffer, 32767); -- 读取响应体到RAW缓冲区
dbms_lob.writeappend(utf8_data, -- 将RAW缓冲区的数据追加到CLOB中
utl_raw.length(raw_buffer), -- 数据长度
utl_raw.cast_to_varchar2(raw_buffer)); -- 将RAW转换为VARCHAR2再写入CLOB
exception
when utl_http.end_of_body then
exit; -- 如果到达响应体结尾,则退出循环
when others then
dbms_output.put_line('在读取响应时发生错误: ' || sqlerrm); -- 其他异常处理
exit; -- 退出循环
end;
end loop;
utl_http.end_response(resp); -- 结束HTTP响应
-- 循环读取并打印CLOB中的内容
idx := 1;
while idx <= dbms_lob.getlength(utf8_data) loop
line := dbms_lob.substr(utf8_data, 255, idx); -- 从CLOB中读取一行数据
dbms_output.put_line(line); -- 打印读取的一行数据
idx := idx + 255; -- 更新索引
end loop;
dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间
exception
when utl_http.end_of_body then
utl_http.end_response(resp); -- 异常处理:如果到达响应体结尾,确保关闭HTTP响应
when others then
dbms_output.put_line('在调用Web服务时发生错误: ' || sqlerrm); -- 其他异常处理
if dbms_lob.istemporary(utf8_data) = 1 then
传参的中文会乱码,但是方法内部的中文不会乱码
dbms_lob.freetemporary(utf8_data); -- 释放临时CLOB空间
end if;
end;
/