程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> 通過PL/SQL訪問Web Services

通過PL/SQL訪問Web Services

日期:2017/1/14 17:22:31      編輯:關於Oracle數據庫

    在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;        測試結果如下:  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved