oracle webservice axis

本文介绍如何使用Oracle 10g通过WebService实现数据同步。具体步骤包括导入必要的工具包、创建WebService客户端和服务端、以及通过SQL调用WebService进行数据交互。
公司有需求是这样的:一台服务器上用MemCached存一了些数据,另一台服务器的数据库上也存了数据,MemCached是数据库的映象,所以问题是数据同步。
数据库是oracle10g,暂考虑以webservice实现,oracle10g中可以使用webservice。
测试例子:
需要导入dbws-callout-utility-10131.zip地址:
http://download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callout-utility-10131.zip
导入方法是这样的:
The jar file can be loaded into the SYS schema for everyone to access, or into an individual schema that needs access to the web client.

# Load into the SYS schema.
export PATH=/u01/app/oracle/product/10.2.0/db_1/bin:$PATH
cd /u01/app/oracle/product/10.2.0/db_1/sqlj/lib
# 10gR2
loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar
# 11g
loadjava -u sys/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb11.jar

# Load into an individual schema.
export PATH=/u01/app/oracle/product/10.2.0/db_1/bin:$PATH
cd /u01/app/oracle/product/10.2.0/db_1/sqlj/lib
# 10gR2
loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar
# 11g
loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb11.jar

导入完成后写如下SQL
Sql代码 复制代码
  1. CREATEORREPLACEFUNCTIONget_city_from_zipcode(ssidININTEGER,ssnameINVARCHAR2)
  2. RETURNVARCHAR2
  3. AS
  4. l_serviceUTL_DBWS.service;
  5. l_callUTL_DBWS.call;
  6. l_resultANYDATA;
  7. l_wsdl_urlVARCHAR2(32767);
  8. l_namespaceVARCHAR2(32767);
  9. l_service_qnameUTL_DBWS.qname;
  10. l_port_qnameUTL_DBWS.qname;
  11. l_operation_qnameUTL_DBWS.qname;
  12. l_input_paramsUTL_DBWS.anydata_list;
  13. BEGIN
  14. l_wsdl_url:='http://localhost:8888/axis/services/OracleSay?wsdl';
  15. l_namespace:='http://localhost:8888/axis/services/OracleSay';
  16. l_service_qname:=UTL_DBWS.to_qname(l_namespace,'OracleSayService');
  17. l_port_qname:=UTL_DBWS.to_qname(l_namespace,'OracleSay');
  18. l_operation_qname:=UTL_DBWS.to_qname(l_namespace,'test');
  19. l_service:=UTL_DBWS.create_service(
  20. wsdl_document_location=>URIFACTORY.getURI(l_wsdl_url),
  21. service_name=>l_service_qname);
  22. l_call:=UTL_DBWS.create_call(
  23. service_handle=>l_service,
  24. port_name=>l_port_qname,
  25. operation_name=>l_operation_qname);
  26. l_input_params(0):=ANYDATA.CONVERTNUMBER(ssid);
  27. l_input_params(1):=ANYdATA.CONVERTVARCHAR2(ssname);
  28. l_result:=UTL_DBWS.invoke(
  29. call_handle=>l_call,
  30. input_params=>l_input_params);
  31. UTL_DBWS.release_call(call_handle=>l_call);
  32. UTL_DBWS.release_service(service_handle=>l_service);
  33. RETURNANYDATA.AccessVarchar2(l_result);
  34. END;
CREATE OR REPLACE FUNCTION get_city_from_zipcode (ssid  IN  INTEGER,ssname IN VARCHAR2)
  RETURN VARCHAR2
AS
  l_service  UTL_DBWS.service;
  l_call     UTL_DBWS.call;
  l_result   ANYDATA;
  
  l_wsdl_url         VARCHAR2(32767);
  l_namespace        VARCHAR2(32767);
  l_service_qname    UTL_DBWS.qname;
  l_port_qname       UTL_DBWS.qname;
  l_operation_qname  UTL_DBWS.qname;
  l_input_params     UTL_DBWS.anydata_list;
BEGIN
  l_wsdl_url        := 'http://localhost:8888/axis/services/OracleSay?wsdl';
  l_namespace       := 'http://localhost:8888/axis/services/OracleSay';

  l_service_qname   := UTL_DBWS.to_qname(l_namespace, 'OracleSayService');
  l_port_qname      := UTL_DBWS.to_qname(l_namespace, 'OracleSay');
  l_operation_qname := UTL_DBWS.to_qname(l_namespace, 'test');

  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_input_params(0) := ANYDATA.CONVERTNUMBER(ssid);
  l_input_params(1) := ANYdATA.CONVERTVARCHAR2(ssname);
  l_result := UTL_DBWS.invoke ( 
    call_handle  => l_call,
    input_params => l_input_params);

  UTL_DBWS.release_call (call_handle => l_call);
  UTL_DBWS.release_service (service_handle => l_service);

  RETURN ANYDATA.AccessVarchar2(l_result);
END;

关于上面一些方法的含意可以看这里:
http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_dbws.htm#i1001229
接下来是server端,使用tomcat6+axis1.4实现,activation.jar,mail.jar,xerces.jar放到tomcat的lib下,建一个web项目然后把axis包中webapps/axis下的东西拷到WebRoot下。
Java代码 复制代码
  1. packagegjs;
  2. publicclassOracleSay{
  3. publicStringtest(intid,Stringname){
  4. return"youidis:"+id+""+"younameis:"+name+"";
  5. }
  6. }
package gjs;

public class OracleSay {
	public String test(int id,String name){
		return "you id is:"+id+" "+"you name is:"+name+"";
	}
}

发布服务:
写一个deploy.wsdd
Xml代码 复制代码
  1. <deploymentxmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  2. <servicename="OracleSay"provider="java:RPC">
  3. <parametername="allowedMethods"value="test"/>
  4. <parametername="className"value="gjs.OracleSay"/>
  5. </service>
  6. </deployment>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="OracleSay" provider="java:RPC">
  <parameter name="allowedMethods" value="test"/>
  <parameter name="className" value="gjs.OracleSay"/>
 </service>
</deployment>

axis.jar里有org.apache.axis.client.AdminClient,run它带参数-lhttp://localhost:8888/axis/services/ src/deploy.wsdd
会在WEB-INF下生成一个server-config.wsdd,如果已经有这个的就直接在
server-config.wsdd中加入:
<service name="OracleSay" provider="java:RPC">
<parameter name="allowedMethods" value="test"/>
<parameter name="className" value="gjs.OracleSay"/>
</service>
想看生成的wsdl在浏览器里http://localhost:8888/axis/services/OracleSay?wsdl
生成:
Xml代码 复制代码
  1. <wsdl:definitionstargetNamespace="http://localhost:8888/axis/services/OracleSay">
  2. <!--
  3. WSDLcreatedbyApacheAxisversion:1.4
  4. BuiltonApr22,2006(06:55:48PDT)
  5. -->
  6. <wsdl:messagename="testResponse">
  7. <wsdl:partname="testReturn"type="xsd:string"/>
  8. </wsdl:message>
  9. <wsdl:messagename="testRequest">
  10. <wsdl:partname="id"type="xsd:int"/>
  11. <wsdl:partname="name"type="xsd:string"/>
  12. </wsdl:message>
  13. <wsdl:portTypename="OracleSay">
  14. <wsdl:operationname="test"parameterOrder="idname">
  15. <wsdl:inputmessage="impl:testRequest"name="testRequest"/>
  16. <wsdl:outputmessage="impl:testResponse"name="testResponse"/>
  17. </wsdl:operation>
  18. </wsdl:portType>
  19. <wsdl:bindingname="OracleSaySoapBinding"type="impl:OracleSay">
  20. <wsdlsoap:bindingstyle="rpc"transport="http://schemas.xmlsoap.org/soap/http"/>
  21. <wsdl:operationname="test">
  22. <wsdlsoap:operationsoapAction=""/>
  23. <wsdl:inputname="testRequest">
  24. <wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://gjs"use="encoded"/>
  25. </wsdl:input>
  26. <wsdl:outputname="testResponse">
  27. <wsdlsoap:bodyencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"namespace="http://localhost:8888/axis/services/OracleSay"use="encoded"/>
  28. </wsdl:output>
  29. </wsdl:operation>
  30. </wsdl:binding>
  31. <wsdl:servicename="OracleSayService">
  32. <wsdl:portbinding="impl:OracleSaySoapBinding"name="OracleSay">
  33. <wsdlsoap:addresslocation="http://localhost:8888/axis/services/OracleSay"/>
  34. </wsdl:port>
  35. </wsdl:service>
  36. </wsdl:definitions>
<wsdl:definitions targetNamespace="http://localhost:8888/axis/services/OracleSay">

<!--
WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)
-->
<wsdl:message name="testResponse">
<wsdl:part name="testReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="testRequest">
<wsdl:part name="id" type="xsd:int"/>
<wsdl:part name="name" type="xsd:string"/>
</wsdl:message>
<wsdl:portType name="OracleSay">
<wsdl:operation name="test" parameterOrder="id name">
<wsdl:input message="impl:testRequest" name="testRequest"/>
<wsdl:output message="impl:testResponse" name="testResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="OracleSaySoapBinding" type="impl:OracleSay">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="test">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="testRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://gjs" use="encoded"/>
</wsdl:input>
<wsdl:output name="testResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8888/axis/services/OracleSay" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="OracleSayService">
<wsdl:port binding="impl:OracleSaySoapBinding" name="OracleSay">
<wsdlsoap:address location="http://localhost:8888/axis/services/OracleSay"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

用java写个client测试:
Java代码 复制代码
  1. publicstaticvoidmain(String[]args)throwsServiceException,MalformedURLException,RemoteException{
  2. StringendPoint="http://localhost:8888/axis/services/OracleSay";
  3. Serviceservice=newService();
  4. Callcall=null;
  5. call=(Call)service.createCall();
  6. call.setOperationName(newQName(endPoint,"test"));
  7. call.setTargetEndpointAddress(newjava.net.URL(endPoint));
  8. Stringstr=(String)call.invoke(newObject[]{182,"李世民"});
  9. System.out.println(str);
  10. }
	public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
		String endPoint="http://localhost:8888/axis/services/OracleSay";
		Service service=new Service();
		Call call=null;
		call=(Call)service.createCall();
		call.setOperationName(new QName(endPoint,"test"));
		call.setTargetEndpointAddress(new java.net.URL(endPoint));
		String str = (String) call.invoke(new Object[]{182,"李世民"});
		System.out.println(str);

	}

输出:you id is:182 you name is:李世民
oracle调用:
Sql代码 复制代码
  1. SELECTget_city_from_zipcode(22,'lui')FROMdual;
SELECT get_city_from_zipcode(22,'lui') FROM dual;

输出:you id is:22 you name is:lui
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值