1. 概述

  最近在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感兴趣的读者可以通过本文最后的相关链接查找了解。

2. 预期读者

  • 数通畅联新员工
  • 广大技术爱好者

3. 环境信息

操作系统:Windows7

Oracle: 版本为oracle11g

Mysql版本为mysql5.1

Jdk:  jdk1.6.0_10

4. 名词解释

AEAI ESB:应用集成平台主要作为企业信息系统的“龙骨”来集成各业务系统,一般称之为企业服务总线(Enterprise Service BUS,ESB),在数通畅联软件的产品家族中应用集成平台命名为AEAI ESB。

AEAI DPAEAI 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数据库存储的程序单元的开发

5. 操作步骤

5.1 创建样例接口

  使用AEAI DP开发平台,创建自带WS服务的应用,如下图:

  选择数据库信息

  部署应用后,查看刚刚创建的应用自带的WS服务

5.2 创建存储过程

5.2.1 基本语法

  以下为创建存储过程的基本语法

CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 )

IS

定义变量

BEGIN

开始PL/SQL体

END

说明PL/SQL体结束

5.2.2 创建步骤

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;

5.2.3 关键点说明

  在存储过程中,使用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);

5.3 调用存储过程

5.3.1 使用PL/SQL Developer测试

1) 选中存储过程的名字,右键选择测试,进入测试页面

2) 添加响应的参数值,F9或者点击按钮开始执行,执行后可以得到看到返回值

3) 切换到DBMS输出页面,可以看到打印的内容

5.3.2 使用sql代码调用

DECLARE

resmark varchar2(1000);

BEGIN

pro_test_ws(''小郑',resmark);

DBMS_OUTPUT.PUT_LINE(resmark);

END;

1) 打开sql窗口,执行上面的sql语句

2) 查看输出信息

  1处为存储过程打印的信息,2为调用时打印输出的信息

6. 总结说明

  本文介绍了在oracle存储过程中,使用UTL_HTTP工具包,通过创建请求报文以及使用HTTP协议来调用Web Service,从创建oracle存储过程以及UTL_HTTP相关参数的配置,到通过PL/SQL Developer测试调用以及sql代码进行调用来详细说明。

  附件为存储过程创建sql、调用sql以及接口程序和相关的数据库文件。

7. 相关链接

AEAI DP开发平台/ AEAI ESB集成平台相关介质以及文档资料地址:http://www.agileai.com/portal/website/01/res-share.ptml

文档及代码附件下载http://pan.baidu.com/s/1kVyMVQn

ORACLE存储过程调用Web Service的更多相关文章

  1. C#开发和调用Web Service

    http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...

  2. php5调用web service

    工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...

  3. .NET易忘备留 ORACLE存储过程调用

    1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...

  4. 通过ksoap2-android来调用Web Service操作的实例

    import java.io.IOException; import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObjec ...

  5. 使用Android应用调用Web Service

    Java本身提供了丰富的Web  Service支持,比如Sun公司指定的JAX-WS  2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ...

  6. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  7. ASP.NET调用Web Service

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  8. delphi调用web service出现 Unable to retrieve the URL endpoint for Service/Port .....

    delphi调用web service出现 Unable to retrieve the URL endpoint  for Service/Port, 错误截图如下 查了很长时间, 发现在DataM ...

  9. php5调用web service (笔者测试成功)

    转自:http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html 感谢作者分享 工作中需要用php调用web service接口, ...

随机推荐

  1. SQL Server 2012大幅增强T-SQL

    SQL Server 2012对T-SQL进行了大幅增强,其中包括支持ANSI FIRST_VALUE和LAST_VALUE函数,支持使用FETCH与OFFSET进行声明式数据分页,以及支持.NET中 ...

  2. JavaScript面试时候的坑洼沟洄——数据类型

    前些日子写了篇关于最近找工作的一些感受的博客 找工作的一些感悟--前端小菜的成长,没想到得到了很多园友的共鸣,得到了很多鼓励,也有园友希望我分享一些笔试.面试的经验.我觉得分享一些笔试题没太多价值,对 ...

  3. Fiddler调式使用知多少(一)深入研究

    Fiddler调式使用(一)深入研究 阅读目录 Fiddler的基本概念 如何安装Fiddler 了解下Fiddler用户界面 理解不同图标和颜色的含义 web session的常用的快捷键 了解we ...

  4. 考勤系统——代码分析datagrid

    datagrid是easyui的控件,DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识 ...

  5. spring mvc Error instantiating class ** with invalid types () or values (). Cause: java.lang.NoSuchMethodException:

    一般引起这种问题的原因是 bean和mapper里面的字段未对应上,或者 bean里面没有默认的构造函数引起的.我今天是后面的一个,自己写了带参数的构造函数引起的这个问题...

  6. Java 循环中标签的作用

    continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环.在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使 ...

  7. Windows无法安装到这个磁盘。请确保在计算机的BIOS菜单中启用了磁盘控制器

    今天一朋友问我这个问题,呃,以前我也遇到过,但忘记记录了,这次就记录一下吧,就懒得打字了,图片里面很清楚了 不说点什么的话是不是太水了O(∩_∩)O~,好吧扩充一下: Windows无法安装到这个磁盘 ...

  8. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  9. Jetstrap 在线构建 Bootstrap 的工具

    Jetstrap 是一个 100% 基于 Web 的 Twitter Bootstrap 构建工具,无需下载软件,只需登录并构建即可.并且别人可以访问你构建的产品.

  10. ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构

    咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...