1、Oracle EBS接口开发之通过 DBWS 包实现 WEBSERVICEAuthor: 苏南生E-Mail: nansheng.su#hand-Creation Date: December 27, 2014Last Updated: December 27, 2014Document Ref: Version: DRAFT 1AApprovals:Copy Number _Oracle ompany Confidential - For internal use onlyDoc Ref: December 27, 2014Error! Reference source not found.
2、Document Control 2Document ControlChange Record3Date Author Version Change Reference2014-12-27 snans Draft 1a No Previous DocumentReviewersName PositionDistributionCopy No. Name Location1 Library Master Project Library2 Project Manager34Note To Holders:If you receive an electronic copy of this docum
3、ent and print it out, please write your name on the equivalent of the cover page, for document control purposes.If you receive a hard copy of this document, please write your name on the front cover, for document control purposes.Oracle ompany Confidential - For internal use onlyDoc Ref: December 27
4、, 2014Error! Reference source not found.Document Control 3ContentsDocument Control. ii1. Webservice. 21.1 一个案例 . 21.2 模拟测试 . 31.3 什么是WebService . 31.4 WebService平台技术 . 42. DBWS包 . 62.1 DBWS . 62.2 下载安装 . 63. XML . 103.1 为什么要说XML . 103.2 命名空间的引入 . 103.3 命名空间的声明与使用 . 114. XPath. 134.1 Xpath简介 . 134.2
5、XPath路径表达式 . 135. Oracle 解析带有命名空间的XML . 185.1 XMLTABLE . 185.2 extract. 186. 信保通对接代码示例. 197. Open and Closed Issues for this Deliverable.20Open Issues . 20Closed Issues. 20Oracle ompany Confidential - For internal use onlyDoc Ref: December 27, 2014Error! Reference source not found.Webservice 21. Web
6、service1.1 一个案例1) 案例功能:通过输入IP地址 查询国家、城市、所有者等信息。2) 返回数据: 一个一维字符串数组 String(1),String(0) = IP地址;String(1) = 查询结果或提示信息3) 案例地址:http:/ WSDL地址:http:/ /WebServices/IpAddressSearchWebService.asmx HTTP/1.1Host: Content-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: “http:/WebX 200 OKContent-Ty
7、pe: text/xml; charset=utf-8Content-Length: lengthstringstringOracle ompany Confidential - For internal use onlyDoc Ref: December 27, 2014Error! Reference source not found.Webservice 31.2 模拟测试1) 软件模拟:通过SOAP协议,发送请求2) 软件模拟:接收返回的数据由于软件的编码缺陷,这边第二个标签内容为:” 中国 移动”3) 附件:案例软件包wfetch.rar通过以上的软件模拟,我们已经大概知道了Webs
8、ervice的大概交互方式和作用。1.3 什么是WebService其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过
9、Web service标准对这些服务进行查询和访问。 Oracle ompany Confidential - For internal use onlyDoc Ref: December 27, 2014Error! Reference source not found.Webservice 4WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述Web service,让客
10、户可以得到足够的信息来调用这个 Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用, 这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。1.4 WebService平台技术XML+XSD,SOAP和WSDL 就是构成WebService平台的三大技术。XML+XSD:WebService采用 HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。 XML解决了数据表
11、示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService 平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。SOAP:WebSe
12、rvice通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP 消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。SOAP协议 = HTTP 协议 + XML数据格式SOAP协议定义了SOAP 消息的格式,SOAP 协议是基于HTTP 协议的,SOAP 也是基于XML和XSD 的, XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公Oracle ompany Confidential - For internal use
13、onlyDoc Ref: December 27, 2014Error! Reference source not found.Webservice 5路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。WSDL:好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务
14、可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。WSDL(Web Services Description Language)就是这样一个基于XML 的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL 既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应 WebService的代理类代码。WS
15、DL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。Oracle ompany Confidential - For internal use onlyDoc Ref: December 27, 2014Error! Reference source not found.DBWS包 62. DBWS包2.1 DBWSOracle在9i 时代就发布了扩展包来支持PL/SQL访问Web Services ,并且在Oracle 10g版本中使得该功能变得更加强大;这都源于引入了UTL_DBWS包,其实它是封装
16、了JPublisher,使得PL/SQL开发者只需要使用简单的几个API就能调用Web Services了。2.2 下载安装1. 检查是否已经安装utl_dbws包SQL desc sys.utl_dbws ERROR: ORA-04043: object sys.utl_dbws does not exist2. 检查数据库中java classes 的状态-2.检查数据库中java classes 的状态SELECT owner, status, count(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE=JAVA CLASS GROUP BY owner, s
17、tatus; OWNER STATUS COUNT(*)- - -APPS VALID 4576MDSYS VALID 564SYS VALID 24722ODM VALID 264ORDSYS VALID 1876-如果存在INVALID状态的失效类,可以运行$ORACLE_HOME/rdbms/admin/utlrp.sql,来修复3. 下载最新的dbwsclient.jar文件Pre 10g: dbws-callout-utility.zip (10.1.2)10g: dbws-callout-utility-10R2.zip (10.1.3.0)10g, 11g System alte
18、red. SQL alter system set JAVA_POOL_SIZE=200M scope=both; System altered.7. 安装# 安装到 SYS schema.export PATH=$ORACLE_HOME/bin:$PATHcd $ORACLE_HOME/sqlj/lib# 10gR2loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar# 11g and 12cloadjava -u sys/password -r
19、-v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb11.jar# 安装到非 SYS schema.export PATH=$ORACLE_HOME/bin:$PATHcd $ORACLE_HOME/sqlj/lib# 10gR2loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar# 11g SQL GRANT EXECUTE ON sys.utl_dbws TO apps;9. 测试脚本如果已经安装完成以上步
20、骤,我们可以通过如下实例来检验我们的Oracle是否已经成功安装DBWS包。新建一个FUNCTION, 作用是:接收两个数值,然后程序调用Webservice,计算两个number的和。CREATE OR REPLACE FUNCTION add_numbers (p_int_1 IN NUMBER,p_int_2 IN NUMBER)RETURN NUMBERASl_service UTL_DBWS.service;l_call UTL_DBWS.call;l_wsdl_url VARCHAR2(32767);l_namespace VARCHAR2(32767);l_service_qna
21、me UTL_DBWS.qname;l_port_qname UTL_DBWS.qname;l_operation_qname UTL_DBWS.qname;l_xmltype_in SYS.XMLTYPE;l_xmltype_out SYS.XMLTYPE;l_return NUMBER;BEGINl_wsdl_url := http:/oracle- := http:/wwworacl323ces/;-l_service_qname := UTL_DBWS.to_qname(l_namespace, Calculator);-l_port_qname := UTL_DBWS.to_qnam
22、e(l_namespace, CalculatorPort);l_operation_qname := UTL_DBWS.to_qname(l_namespace, ws_add);l_service := UTL_DBWS.create_service (wsdl_document_location = URIFACTORY.getURI(l_wsdl_url),service_name = l_service_qname);l_call := UTL_DBWS.create_call (service_handle = l_service,port_name = l_port_qname,operation_name = l_operation_qname);l_xmltype_in := SYS.XMLTYPE( | p_int_1 | | p_int_2 | );l_xmltype_out := UTL_DBWS.invoke(call_Handle = l_call,request = l_xmltype_in);