ORACLE存储过程调用Web Service
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 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数据库存储的程序单元的开发
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的更多相关文章
- C#开发和调用Web Service
http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...
- php5调用web service
工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...
- .NET易忘备留 ORACLE存储过程调用
1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...
- 通过ksoap2-android来调用Web Service操作的实例
import java.io.IOException; import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObjec ...
- 使用Android应用调用Web Service
Java本身提供了丰富的Web Service支持,比如Sun公司指定的JAX-WS 2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- ASP.NET调用Web Service
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
- 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 ...
- php5调用web service (笔者测试成功)
转自:http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html 感谢作者分享 工作中需要用php调用web service接口, ...
随机推荐
- 初识ASP.NET Core 1.0
本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...
- ASP.NET MVC (Razor)开发<<周报与绩效考核系统>>,并免费提供园友们使用~~~
过去我们使用过一些周报工具来完成项目组或部门的周报填写与考核工作,但多少有些不理想,要么功能太过简单,要么功能特别繁杂,不接地气,使用不便. 后来我们就考虑自己开发一个简单的,实用的,易用的,接地气的 ...
- Web3DGame之路,Babylonjs 和TypeScript学习笔记(二)
先来认识一下Babylonjs,由于基于webgl来开发,所以先介绍一下基础知识. Webgl是一个html标准,他要在canvas元素上初始化. Html页面上的准备 所以我们先从html页面开始看 ...
- Win8 Metro动态加载内容框架
制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...
- Azure PowerShell (6) 设置单个Virtual Machine Endpoint
<Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...
- Java动态编译
程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...
- 前端编码规范之JavaScript
上次浅谈了下关于CSS的编码规范,大部分童鞋持赞同意见,仍存在一些童鞋不太理解这些规范的意义. 如果是个人或者小作坊开发,其实这些所谓的编码规范也没啥意思,因为大家写好的代码直接就给扔到网上去了,很少 ...
- 负载均衡session会话保持方法
负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法:1.使用cookie将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用 ...
- 推荐21款最佳 HTML5 网页游戏
尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...