在Web Services紅得發紫的今天,到處都在談論和使用Web Services;當然,其中有不小一部分是屬於業界炒作。 Oracle也始終走在技術的最前沿,早在9i時代就發布了擴展包來支持PL/SQL訪問Web Services,並且在Oracle 10g版本中使得該功能變得更加強大;這都源於引入了UTL_DBWS包,其實它是封裝了JPublisher,使得PL/SQL開發者只需要使用簡單的幾個API就能調用Web Services了。
下面我將通過一個實例向你展示如何通過PL/SQL調用Web Services,本文的重點是PL/SQL調用Web Services實現上,對於如何發布Web Services,你可以參考本人的另一篇基礎性文章《用OC4J和Axis構建Web Services》或者其他參考資料。
首先,我們來搭建運行環境吧,你得從Oracle OTN下載並安裝Oracle Database(企業版、標准版、個人版均可,但切勿安裝快捷版,因為它沒有提供sqlj組件及相關命令)。假如你已安裝好該數據庫,可跳過該步驟。
然後,需要下載對應版本的UTL_DBWS:
Pre 10g: dbws-callout-utility.zip
10g: dbws-callout-utility-10R2.zip
下載完成後,需要解壓該文件到<oracle_install_dir>/sqlj/lib目錄下,我們還需要使用loadJava將這些jar文件加載到SYS schema中,供所有用戶使用該擴展包,命令如下: <oracle_install_dir>/bin/loadjava -u sys/passWord -r -v -f -s -grant public -noverify -genmissing <oracle_install_dir>/sqlj/lib /dbwsclient.jar
其實在Oracle的文檔中是聲稱10g是自帶UTL_DBWS包的,不過我下載最新的Oracle並完全安裝後,也沒有發現UTL_DBWS的半點蹤影,也只好自己拷貝並執行loadjava了。
好了,現在萬事俱備,只剩寫程序測試了,在編碼測試之前,我們假設你已經將《用OC4J和Axis構建Web Services》文章裡hellows已經部署好了,並能正常的調用sayHello方法了;當然,你發布其他的Web Services服務也同樣可行的。下面我們就創建一個function來進行測試,測試代碼如下: CREATE OR REPLACE FUNCTION call_sayHello (username IN VARCHAR2)
RETURN VARCHAR2
AS
l_service UTL_DBWS.service;
l_call UTL_DBWS.call;
l_result ANYDATA; l_wsdl_url VARCHAR2(1024);
l_service_name VARCHAR2(200);
l_operation_name VARCHAR2(200);
l_input_params UTL_DBWS.anydata_list;
BEGIN
l_wsdl_url := 'http://localhost:8888/hellows/helloService?WSDL';
l_service_name := 'helloService';
l_operation_name := 'sayHello'; l_service := UTL_DBWS.create_service (
wsdl_document_location => URIFACTORY.getURI(l_wsdl_url),
service_name => l_service_name); l_call := UTL_DBWS.create_call (
service_handle => l_service,
port_name => NULL,
operation_name => l_operation_name);
l_input_params(1) := ANYDATA.ConvertVarchar2(username); 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);
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END call_sayHello; 測試結果如下: