Consommer un Webservice à l'aide de UTL_DBWS

Arrière-plan:
Nous avons un Service qui s'exécute sous axis2 sur un Tomcat. Nous aimerions que notre Oracle (10g Enterprise Edition Version 10.2.0.1.0) db à appeler notre Webservice lorsqu'une nouvelle ligne est entré dans l'une de nos tables. Nous avons découvert, nous pouvons utiliser un déclencheur pour appeler un Java Procédure Stockée (JSP) ou us PL/SQL et le UTL_DBWS utilitaire. Il n'est ni de travail pour nous, cependant. Consommer le service web à partir d'un java autonome de la classe en utilisant soit l'axe javax.xml.rpc mise en œuvre ou l'oracle de la mise en œuvre n'travailler à l'extérieur de la db.

UTL_DBWS tentative:

décompressé le contenu de dbws-callout-utility-10131.zip pour C:\oracle\product\10.2.0\db_5\sqlj\lib qui a été tiré vers le bas à partir de http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.html

couru loadjava commande

loadjava -u <USER>/<PASSWORD>@<MACHINE>:1521:<INSTANCE> -r -v -f -genmissing -s -grant public C:\oracle\product\10.2.0\db_5\sqlj\lib\dbwsclientws.jar C:\oracle\product\10.2.0\db_5\sqlj\lib\dbwsclientdb102.jar

Ajouté un tas d'autorisations

execute dbms_java.grant_permission( '<<user>>', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' )
    execute dbms_java.grant_permission( '<<user>>', 'SYS:oracle.aurora.security.JServerPermission', 'Verifier', '' );
    execute dbms_java.grant_permission( '<<user>>', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.sun.util.calendar', '' ) ;
    execute dbms_java.grant_permission( '<<user>>', 'SYS:java.net.SocketPermission', '<<machineName>>', 'resolve' );
    execute dbms_java.grant_permission( '<<user>>', 'SYS:java.net.SocketPermission', '<<machineIP>>', 'connect,resolve' );
    execute dbms_java.grant_permission( '<<user>>', 'SYS:java.lang.RuntimePermission', 'createClassLoader', '' );

Notre pl/sql:

FUNCTION wsproxy_send_request
return varchar2
as
l_service            SYS.UTL_DBWS.service;
l_call               SYS.UTL_DBWS.call;
l_result             ANYDATA;
l_wsdl_url           VARCHAR2(32767);
l_namespace          VARCHAR2(32767);
l_service_qname      SYS.UTL_DBWS.qname;
l_port_qname         SYS.UTL_DBWS.qname;
l_operation_qname    SYS.UTL_DBWS.qname;
l_input_params       SYS.UTL_DBWS.anydata_list;
boolean_type_qname   SYS.UTL_DBWS.QNAME;
begin
l_wsdl_url := 'http://<<host>>/axis2/services/<<serviceName>>?wsdl';
l_namespace := 'http://<<namespace>>';
l_service_qname := SYS.UTL_DBWS.to_qname(l_namespace, '<<serviceName>>');
l_port_qname := SYS.UTL_DBWS.to_qname(l_namespace, '<<myendpoint>>');
l_operation_qname := SYS.UTL_DBWS.to_qname(l_namespace, 'send');
l_service := SYS.UTL_DBWS.create_service (wsdl_document_location => URIFACTORY.getURI(l_wsdl_url), service_name => l_service_qname);
l_call := SYS.UTL_DBWS.create_call ( service_handle => l_service, port_name => l_port_qname, operation_name => l_operation_qname);
SYS.UTL_DBWS.SET_PROPERTY(l_call, 'OPERATION_STYLE', 'rpc');
l_input_params(0) := ANYDATA.ConvertNumber(1);
l_input_params(1) := ANYDATA.ConvertNumber(24387236726);
l_input_params(2) := ANYDATA.ConvertVarchar2('CTE');
l_input_params(3) := ANYDATA.ConvertVarchar2('STORE_RECORD_LOCATOR');
l_input_params(4) := ANYDATA.ConvertVarchar2('a');
boolean_type_qname := sys.utl_dbws.to_qname('http://www.w3.org/2001/XMLSchema', 'boolean');
sys.utl_dbws.set_return_type(l_call, boolean_type_qname);
l_result := SYS.UTL_DBWS.invoke (call_handle => l_call, input_params => l_input_params);
SYS.UTL_DBWS.release_call (call_handle => l_call);
SYS.UTL_DBWS.release_service(service_handle => l_service);
RETURN ANYDATA.AccessVarchar2(l_result);
END;

Quand nous exécutons:

select wsproxy_send_request from dual;

nous obtenons:

Error: ORA-29532: Java call terminated by uncaught Java exception: java.lang.ArrayIndexOutOfBoundsException
ORA-06512: at "SYS.UTL_DBWS", line 568
ORA-06512: at "SYS.UTL_DBWS", line 492
ORA-06512: at "SYS.UTL_DBWS", line 380
ORA-06512: at "WSPROXY.WSPROXY_SEND_REQUEST", line 37
SQLState:  99999
ErrorCode: 29532
Position: 37

(Position 37 est l'appel invoke)

  • Remarqué cette question après j'ai demandé à stackoverflow.com/questions/37586/... On peut essayer de les UTL_HTTP et voir si cela fonctionne.
  • J'ai trouvé que si je supprime tous les paramètres, à l'exception de la première, qui n'est pas valide pour notre webservice, je reçois une autre exception ORA-29532: Java appel résilié par uncaught exception Java: javax.xml.rpc.le savon.SOAPFaultException: inconnu ORA-06512: à "SYS.UTL_DBWS", la ligne 388 ORA-06512: à "SYS.UTL_DBWS", la ligne 385 ORA-06512: à "WSPROXY.WSPROXY_SEND_REQUEST", la ligne 41, mais le truc cool, c'est... que c'est générée, car l'Axe est la réception de la demande et de rechigner, car il ne contient pas le droit params.
InformationsquelleAutor Josh | 2009-07-27