WebServices in Oracle 11g

wzq609發表於2015-02-14

前言:本文件介紹ORACLE通過UTL_DBWS去呼叫Web Serices的服務,關於web service網上有一篇文件寫的不錯,http://www.ruanyifeng.com/blog/2009/08/what_is_web_service.html,一次業務的需要也要用來這個服務,以下是整個配置的過程。

 

附:http://oracle-base.com/articles/10g/utl_dbws-10g.php或http://blog.csdn.net/cai_xingyun/article/details/40951595(ORACLE官方的配置步驟),由於配置的過程中發現了一點點的不一樣,就因為一點點的不一樣,讓我連續兩天吃不好、睡不好,所以我覺得很有必要把整個明細的步驟寫下來:

 

環境說明:資料庫的版本為11.2.0.3(現在10G的版本用的人不多了)

作業系統:windows2003、windows2008和linux64_6.3配置的步驟都是一樣的

 

配置步驟:

一、下載安裝包

In a previous article I presented a method for Consuming Web Services using a basic SOAP implementation. This article provides similar functionality, but this time using the UTL_DBWS package, which is essentially a PL/SQL wrapper over JPublisher.

First, download the latest copy of the dbwsclient.jar file:

 

二、把下載的包放入到目錄/u01/app/oracle/product/OraDb11g_home1/sqlj/lib

image

 

三、進行包的匯入(步驟寫著可以用sys使用者匯入,但是測試的時候sys使用者報錯很多,用了system使用者後解決)

注:windows需要先安裝java,並在oracle使用者下執行

11g的匯入步驟:
loadjava -u system/password -r -v -f -genmissing dbwsclientws.jar dbwsclientdb11.jar

 

10g R2的匯入指令碼

loadjava -u system/password  -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar
 
四、建立pkg:utl_dbws,並授權
SQL> @utl_dbws_decl
SQL> @utl_dbws_body

SQL> CREATE PUBLIC SYNONYM utl_dbws FOR sys.utl_dbws;
SQL> GRANT EXECUTE ON sys.utl_dbws TO test;   授權給使用者;
 
檢查執行結果,指令碼:select * from dba_objects where object_name='UTL_DBWS';
image 
經過以上執行,utl_dbws建立完成了,以下是測試步驟:
 
五、ORACLE提供了相應的測試指令碼,但是如果你安裝這個測試指令碼執行,會一直報如下錯誤:
image 
 
經過一番排除之後,發現了一點小問題,經過修改後,請用這個指令碼進行測試:

CREATE OR REPLACE Function Add_Numbers(p_Int_1 In Number, p_Int_2 In Number) Return Number As
   l_Service Utl_Dbws.Service;
   l_Call    Utl_Dbws.Call;

   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_Xmltype_In  Sys.Xmltype;
   l_Xmltype_Out Sys.Xmltype;
   l_Return      Number;
Begin
   l_Wsdl_Url  := '
http://oracle-base.com/webservices/server.php?wsdl';
   l_Namespace := 'http://oracle-base.com/webservices/';

   l_Service_Qname   := Utl_Dbws.To_Qname(l_Namespace, 'Calculator');
   l_Port_Qname      := Utl_Dbws.To_Qname(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      => null --  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);

   Utl_Dbws.Release_Call(Call_Handle => l_Call);
   Utl_Dbws.Release_Service(Service_Handle => l_Service);

   l_Return := l_Xmltype_Out.Extract('//return/text()').Getnumberval();
   Return l_Return;
End;
/

如果下面的語句的執行結果跟我的一樣,恭喜你:成功了!
SELECT add_numbers(10, 15) FROM dual;

ADD_NUMBERS(10,15)
------------------
                25

 

總結:年末這個時間點,要靜下心來研究一個技術真不是一件容易的事情。本來不是很難的一個問題,弄的焦頭爛額。做技術請先把心靜下來;

........................................................................................................................................................................

本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 ) 

........................................................................................................................................................................

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-1436038/,如需轉載,請註明出處,否則將追究法律責任。

相關文章