最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程当中进行的,本文就oracle存储过程调用web service来进行说明。其余主流数据库,好比mysql和sql service,调用web service的方法这里就不作介绍了,本文主要用来介绍oracle存储过程调用Web Service的方法。
众所周知,在Web Service经过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增长了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP协议是基于HTTP协议的,二者的关系就比如高速公路是基于普通公路改造的,在一条公路上加上隔离栏后就成了高速公路。
同理,在oracle的存储过程当中能不能也经过建立XML格式的报文+HTTP协议来调用Web Service呢?答案是确定的,在ORACLE中有一个名叫UTL_HTTP的工具包,咱们能够经过这个工具包来实现存储过程调用Web Service。
上文提到的AEAI ESB是数通畅联的核心产品之一,能够实现WEB服务开发和WEB服务注册等功能,本文的接口样例,本考虑使用ESB建立的WEB服务,可是因为涉及到的须要介绍的内容和本文主题太远,因此采用了AEAI DP开发平台自带的Web服务样例来讲明。有对AEAI ESB感兴趣的读者能够经过本文最后的相关连接查找了解。mysql
数通畅联新员工
广大技术爱好web
操做系统:Windows7
Oracle: 版本为oracle11g
Mysql:版本为mysql5.1
Jdk: jdk1.6.0_10sql
AEAI ESB:应用集成平台主要做为企业信息系统的“龙骨”来集成各业务系统,通常称之为企业服务总线(Enterprise Service BUS,ESB),在数通畅联软件的产品家族中应用集成平台命名为AEAI ESB。
AEAI DP:AEAI DP应用开发平台专门用于开发MIS类的Java Web应用,也称Miscdp(Misc Develope Platform)综合应用开发平台。 AEAI DP应用开发平台在数通畅联软件产品家族中也做为扩展开发的支撑工具,好比:为AEAI Portal门户平台扩展开发Portlet组件、Web Service和Http Service;为AEAI BPM流程集成平台扩展开发业务流程表单及功能等。
存储过程:大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,通过第一次编译后再次调用不须要再次编译,用户经过指定存储过程的名字并给出参数(若是该存储过程带有参数)来执行它。
UTL_HTTP:oracle中自带的HTTP协议工具包,能够用来发送post请求。
PL/SQL Developer: 一个集成开发环境,由Allround Automations公司开发,专门面向Oracle数据库存储的程序单元的开发数据库
使用AEAI DP开发平台,建立自带WS服务的应用,以下图:oracle
选择数据库信息工具
部署应用后,查看刚刚建立的应用自带的WS服务 post
如下为建立存储过程的基本语法
CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 )
IS
定义变量
BEGIN
开始PL/SQL体
END
说明PL/SQL体结束测试
1.打开PL/SQL,并打开一个sql窗口
2.将建立存储过程的语句放入其中并执行
这样一个调用web service的存储过程样例就建立了,如下为详细的样例sql体
--建立存储过程,定义四个参数,入参:userid,code,name;出参:resmark
CREATE OR REPLACE PROCEDURE pro_test_ws(name in varchar2,resmark out varchar2) IS
--定义四个变量,http请求,http返回,请求报文,返回报文
http_req UTL_HTTP.REQ;
http_Resp UTL_HTTP.RESP;
request_env VARCHAR2(32767);
l_Replyline VARCHAR2(1000);
BEGIN
--开始pl/sql体
request_env := '
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:demo="http://demo.service.wstest.agileai.com/">
<soapenv:Header/>
<soapenv:Body>
<demo:sayHi>
<!--Optional:-->
<theGirlName>'|| name ||'</theGirlName>
</demo:sayHi>
</soapenv:Body>
</soapenv:Envelope>
';
--打印请求报文
dbms_output.put_line(request_env);
--请求WS地址
http_req := UTL_HTTP.
begin_request('http://localhost:6060/cam/services/UserSync?wsdl',
'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);
dbms_output.put_line(l_Replyline);
--付给存储过程出参
resmark:=l_Replyline;
END pro_test_ws;编码
在存储过程当中,使用UTL_HTTP工具包调用web服务时,几个关键方法的使用说明
1.经过设置请求地址、方式、协议版本,获得http请求对象
http_req := UTL_HTTP.
begin_request(' http://localhost:6060/wstest_project/services/HelloWorld?wsdl ',
'POST',
UTL_HTTP.http_version_1_1);
2.设置协议保持链接状态
Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE);
3.设置请求编码,SOAPAction header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。
Utl_Http.Set_Header(http_req, 'Content-Type', 'text/xml;charset=utf-8');
Utl_Http.Set_Header(http_req, 'SOAPAction', '');
4.设置字符集
Utl_Http.Set_Body_Charset(http_req, 'utf-8');
5.报文长度
Utl_Http.Set_Header(http_req, 'Content-Length', Lengthb(request_env));
6.调用服务,发送报文
Utl_Http.Write_Line(http_req, request_env);
7.获得返回体
http_Resp := Utl_Http.Get_Response(http_req);
8.将返回报文赋值给变量
Utl_Http.Read_Text(http_Resp, l_Replyline);spa
1)选中存储过程的名字,右键选择测试,进入测试页面
2)添加响应的参数值,F9或者点击按钮开始执行,执行后能够获得看到返回值
3)切换到DBMS输出页面,能够看到打印的内容
DECLARE
resmark varchar2(1000);
BEGIN
pro_test_ws(''小郑',resmark);
DBMS_OUTPUT.PUT_LINE(resmark);
END;
1)打开sql窗口,执行上面的sql语句
2)查看输出信息
1处为存储过程打印的信息,2为调用时打印输出的信息
本文介绍了在oracle存储过程当中,使用UTL_HTTP工具包,经过建立请求报文以及使用HTTP协议来调用Web Service,从建立oracle存储过程以及UTL_HTTP相关参数的配置,到经过PL/SQL Developer测试调用以及sql代码进行调用来详细说明。
附件为存储过程建立sql、调用sql以及接口程序和相关的数据库文件。
AEAI DP开发平台/ AEAI ESB集成平台相关介质以及文档资料地址: http://www.agileai.com/portal/website/01/res-share.ptml