oracle调用webservice过程
创建ACL授权
--创建acl
begin
dbms_network_acl_admin.create_acl ( -- 创建访问控制文件(ACL)
acl => 'mz_utl_http.xml', -- 文件名称
description => 'this is djdzh to webservice', -- 描述
principal => 'DJDZH', -- 授权或者取消授权账号,大小写敏感
is_grant => TRUE, -- 授权还是取消授权
privilege => 'connect', -- 授权或者取消授权的权限列表
start_date => null, -- 起始日期
end_date => null -- 结束日期
);
dbms_network_acl_admin.add_privilege ( -- 添加访问权限列表项
acl => 'mz_utl_http.xml', -- 刚才创建的acl名称
principal => 'DJDZH', -- 授权或取消授权用户
is_grant => TRUE, -- 与上同
privilege => 'resolve', -- 权限列表
start_date => null,
end_date => null
);
-- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
dbms_network_acl_admin.assign_acl (
acl => 'mz_utl_http.xml',
-- ip地址或者域名,填写http://localhost会报host无效
-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
host => '10.172.13.93',
lower_port => 9000, -- 允许访问的起始端口号
upper_port => Null -- 允许访问的截止端口号
);
commit;
end;
begin
dbms_network_acl_admin.assign_acl ( -- 可以授权多个主机,或者多个主机的多个端口
acl => 'mz_utl_http.xml',
host => '10.172.13.93',
lower_port => 80,
upper_port => NUll
);
commit;
end;
创建存储过程调用webservice
-- 创建存储过程,定义参数,入参:ebeln;出参:resultVal
CREATE OR REPLACE PROCEDURE pro_test_ws(ebeln in varchar2,resultVal out varchar2) IS
-- 定义四个变量,http请求,http返回,请求报文,返回报文
http_req UTL_HTTP.REQ;
http_Resp UTL_HTTP.RESP;
request_env VARCHAR2(32767);
l_Replyline VARCHAR2(32767);
mzresult CLOB; -- 响应报文太大,必须用大文本字段CLOB接受,varchar2会报错
BEGIN
--开始pl/sql体
request_env := '<soapenv:xxxxxxxxx/" xmlns:md="http://xxxxxxxx/xxxxx">
<soapenv:Header/>
<soapenv:Body>
<md:MT_SHARE_SGDUOMLD2CEERP_REQ>
<OUTPUT>
<![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<RequestMessage>
<Header>
<EBELN>'||ebeln||'</EBELN>
<IEXT01>1</IEXT01>
<IEXT02></IEXT02>
<IEXT03></IEXT03>
<IEXT04></IEXT04>
<IEXT05></IEXT05>
</Header>
</RequestMessage>
]]>
</OUTPUT>
</md:MT_SHARE_SGDUOMLD2CEERP_REQ>
</soapenv:Body>
</soapenv:Envelope>';
-- 打印请求报文
-- dbms_output.put_line(request_env);
-- 请求WS地址
http_req:= UTL_HTTP.begin_request('http://xxxxxx:80/xxxxxx/getUser','POST',UTL_HTTP.http_version_1_1);
-- 保持连接状态
Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE);
-- 设置编码
Utl_Http.Set_Header(http_req, 'Content-Type', 'text/xml;charset=utf-8');
Utl_Http.Set_Header(http_req, 'SOAPAction', '');
-- 设置字符集
Utl_Http.Set_Body_Charset(http_req, 'utf-8');
-- 该参数代表我发送的POST报文多长,不可少
Utl_Http.Set_Header(http_req, 'Content-Length', Lengthb(request_env));
Utl_Http.Write_Line(http_req, request_env);
-- 赋值http返回
http_Resp:= Utl_Http.get_response(http_req);
-- 将返回报文赋值给 l_Replyline
Utl_Http.read_text(http_Resp, l_Replyline);
-- 付给存储过程出参
mzresult:=l_Replyline;
if instr(mzresult,'没找到符合')<1 then
-- 当数据量太大不适合使用返回参数接手,使用表插入方式
insert into testmz(id,responseData,createdate)
values(ebeln,mzresult,sysdate );
commit;
end if;
--结束请求
-- Utl_Http.end_request(http_req);
Utl_Http.end_response(http_Resp);
-- utl_http.destroy_request_context(http_req);
-- 当异常时也需要关闭http_resp响应,否则报错请求频繁
exception
when UTL_HTTP.TOO_MANY_REQUESTS THEN Utl_Http.end_response(http_Resp);
END pro_test_ws;
调用测试
--调用测试
DECLARE
resmark varchar2(32767);
BEGIN
pro_test_ws('0100743759',resmark);
END;