Oracle調用webservice說明

來源:互聯網
上載者:User
1.             用途簡介

為什麼要在Oracle中訪問WebService?在系統實現中,有時會有直接在資料庫端利用觸發器、預存程序等方式進行資料傳遞、分發的業務,而其中可能會涉及一些商務邏輯,為了處理這些商務邏輯,並簡單起見,可以直接在觸發器或預存程序中調用一些java類或WebService。

2.             準備工作

1、首先保證Oracle為完整安裝(本文均以10.2g);

2、下載對應版本的UTL_DBWS(一個工具包dbws-callout-utility-10131.zip),解壓後放到oracle安裝目錄下的<oracle_install_dir>/sqlj/lib中;

      3、在命令列中利用loadjava命令(一般安裝完jdk或oracle之後就會有)將jar包匯入oracle對應的使用者中:

loadjava -u user/pwd@dbinstance -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar

若為SYS使用者,命令為:

loadjava -u sys/change_on_install -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar

3.             步驟說明

前面準備工作做好之後,如果未發現UTL_DBWS(可以在plsql中敲入sys.若未有utl_dbws顯示,則需要進行初始化),需要運行之前下載的包中dbws-callout-utility-10131\sqlj\lib\ utl_dbws_body.sql及utl_dbws_decl.sql,這樣準備工作基本就緒,下面是調用的步驟:

1、 編寫sql函數並發布。

create or replace function FUNC_GENERATE_LOGINNAME(xmlstring 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://192.168.21.85:9080/xgxt/services/wfWebService?wsdl';
       l_service_name := 'WorkflowWebServiceService';
       l_operation_name := 'saveFormData';
       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(xmlstring);
            
       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 substr(sqlerrm,0,2000);
    END FUNC_GENERATE_LOGINNAME;

2、 查看結果(select func_generate_loginname(var) from dual)

對於其中出現的異常,最可能的就是出現許可權不足,可以利用如下語句解決:

begin
dbms_java.grant_permission( 'XGXT', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );
dbms_java.grant_permission( 'XGXT','SYS:java.lang.IllegalAccessException','getClassLoader', '' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.sun.util.calendar', '' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.lang.RuntimePermission', 'setFactory', '' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.util.PropertyPermission', 'HTTPClient.socket.idleTimeout', 'write' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.net.SocketPermission', 'localhost', 'resolve' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.net.SocketPermission', '192.168.21.203:80', 'connect,resolve' );
dbms_java.grant_permission( 'XGXT', 'SYS:java.lang.RuntimePermission', 'createClassLoader', '' );
end;

4.             附

1、以上還只是針對windows伺服器,對於unix/linux,主要是一些環境變數需要配置,需要查文檔解決。

2、有協助的語句

SELECT owner, status, count(*) FROM DBA_OBJECTS
WHERE OBJECT_TYPE='JAVA CLASS'
GROUP BY owner, status;
select * from User_Objects t where t.object_type like '%JAVA_CLASS%' and object_name like '%DbwsProxy%';

SELECT   TEXT   FROM   ALL_SOURCE  
WHERE   TYPE   =   'PACKAGE'   and owner like '%XGXT%'

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.