oracle调用webservice过程

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;
posted @ 2021-07-11 13:29  幸运刘  阅读(981)  评论(0)    收藏  举报