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.
Vous devez vous connecter pour publier un commentaire.
L'astuce consiste à ajouter les types de paramètre/nom... je n'ai pas trouvé la UTL_DBWS.add_parameter méthode décrite n'importe où, mais je doit bien deviné, c'est l'existence depuis que vous avez à faire la même chose dans une implémentation de java.
En tout cas voici ce que j'ai ajouté
Donc, le tout maintenant est:
J'ai enfin vu cette après préoccupent de plus en plus le guide publié dans l'oracle forums
http://forums.oracle.com/forums/thread.jspa?threadID=633268&tstart=0
Je suis nulle pour ma réponse maintenant, mais le paramètre problème a été résolu.
Je n'ai pas utilisé ce package pour le moment, mais généralement dans Oracle les tableaux sont numérotés de 1 à N. Pourriez-vous remplacer les lignes 28 à 32 avec: