Oracle调用webservice说明
1.???????????? 用途簡介
為什么要在Oracle中訪問WebService?在系統(tǒng)實(shí)現(xiàn)中,有時(shí)會有直接在數(shù)據(jù)庫端利用觸發(fā)器、存儲過程等方式進(jìn)行數(shù)據(jù)傳遞、分發(fā)的業(yè)務(wù),而其中可能會涉及一些業(yè)務(wù)邏輯,為了處理這些業(yè)務(wù)邏輯,并簡單起見,可以直接在觸發(fā)器或存儲過程中調(diào)用一些java類或WebService。
2.???????????? 準(zhǔn)備工作
1、首先保證Oracle為完全安裝(本文均以10.2g);
2、下載對應(yīng)版本的UTL_DBWS(一個(gè)工具包dbws-callout-utility-10131.zip),解壓后放到oracle安裝目錄下的<oracle_install_dir>/sqlj/lib中;
????? 3、在命令行中利用loadjava命令(一般安裝完jdk或oracle之后就會有)將jar包導(dǎo)入oracle對應(yīng)的用戶中:
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.???????????? 步驟說明
前面準(zhǔn)備工作做好之后,如果未發(fā)現(xiàn)UTL_DBWS(可以在plsql中敲入sys.若未有utl_dbws顯示,則需要進(jìn)行初始化),需要運(yùn)行之前下載的包中dbws-callout-utility-10131\sqlj\lib\ utl_dbws_body.sql及utl_dbws_decl.sql,這樣準(zhǔn)備工作基本就緒,下面是調(diào)用的步驟:
1、 編寫sql函數(shù)并發(fā)布。
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、 查看結(jié)果(select func_generate_loginname(var) from dual)
對于其中出現(xiàn)的異常,最可能的就是出現(xiàn)權(quán)限不足,可以利用如下語句解決:
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服務(wù)器,對于unix/linux,主要是一些環(huán)境變量需要配置,需要查文檔解決。
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%'
總結(jié)
以上是生活随笔為你收集整理的Oracle调用webservice说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 军队任免处是干什么的
- 下一篇: 删除信使服务