UTL_DBWS: chiamata web services da PL/SQL

lunedì 03 settembre 2012 - 17.15
Tag Elenco Tags  C#  |  .NET 3.5  |  Oracle 10g

volperubbia Profilo | Senior Member

Ciao a tutti,
vorrei creare una funzione oracle (versione 10.2) per chiamare via pl/sql i metodi di un web services
e pensavo di usare UTL_DBWS.

CREATE OR REPLACE FUNCTION FN_WS_CALL_METHOD
(
p_WS_URL VARCHAR2,
p_WS_NAMESPACE VARCHAR2,
p_WS_METHOD VARCHAR2
)
RETURN VARCHAR2
IS
v_WSDL_URL VARCHAR2(4000) := P_WS_URL || '?WSDL';
v_SERVICE SYS.UTL_DBWS.SERVICE;
v_CALL SYS.UTL_DBWS.CALL;
v_RESPONSE SYS.XMLTYPE;
v_REQUEST SYS.XMLTYPE;
v_OUTPUT VARCHAR2(4000) := '';
BEGIN
v_SERVICE := SYS.UTL_DBWS.CREATE_SERVICE(URIFACTORY.GETURI(v_WSDL_URL), SYS.UTL_DBWS.TO_QNAME(p_WS_NAMESPACE, p_WS_METHOD));
v_CALL := SYS.UTL_DBWS.CREATE_CALL(v_SERVICE);
SYS.UTL_DBWS.SET_TARGET_ENDPOINT_ADDRESS(v_CALL, p_WS_URL);
SYS.UTL_DBWS.SET_PROPERTY(v_CALL, 'SOAPACTION_URI', p_WS_NAMESPACE || p_WS_METHOD);
SYS.UTL_DBWS.SET_PROPERTY(v_CALL, 'SOAPACTION_USE', 'TRUE');
SYS.UTL_DBWS.SET_PROPERTY(v_CALL, 'OPERATION_STYLE', 'DOCUMENT');
v_REQUEST := SYS.XMLTYPE(
'<' || p_WS_METHOD || 'XMLNS="' || p_WS_NAMESPACE || '">' ||
-- EVENTUALI PARAMETRI
'</' || p_WS_METHOD || '>'
);
v_RESPONSE := SYS.UTL_DBWS.INVOKE(v_CALL, v_REQUEST);
v_OUTPUT := v_RESPONSE.EXTRACT('//' || p_WS_METHOD || 'RESULT/CHILD::TEXT()', 'XMLNS="' || p_WS_NAMESPACE || '"').GETSTRINGVAL();
SYS.UTL_DBWS.RELEASE_SERVICE(v_SERVICE);
RETURN v_OUTPUT;
END;
/

Può essere un idea o ci sono soluzioni migliori?
Al momento la funzione precedente, a cui manca ancora la gestione di un parametro dove concatenare le coppie chiave / valore dei
parametri del metodo, ritorna il seguente errore:
ORA-29540: LA CLASSE ORACLE/JPUB/RUNTIME/DBWS/DBWSPROXY NON ESISTE.

Come si può risolvere?

Ho provato con:
1) http://www.oracle-base.com/articles/10g/utl_dbws-10g.php
2) download "10g & 11g latest: dbws-callout-utility-10131.zip (10.1.3.1)"
3) copiati i files *.jar sotto C:\oracle\product\10.2.0\db_1\sqlj\lib
4) CD C:\oracle\product\10.2.0\db_1\sqlj\lib
5) loadjava -u pippo/pippo@pippo -r -v -f -s -grant public -genmissing dbwsclientws.jar dbwsclientdb102.jar
6)
EXEC DBMS_JAVA.GRANT_PERMISSION('pippo', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '');
EXEC DBMS_JAVA.GRANT_PERMISSION('pippo', 'SYS:java.util.logging.LoggingPermission', 'control', '');
EXEC DBMS_JAVA.GRANT_PERMISSION('pippo', 'SYS:java.lang.RuntimePermission', 'setFactory', '');

e ora ottengo:
ORA-29532: chiamata Java terminata a causa di un'eccezione Java non ottenuta: java.lang.IllegalAccessException: java.lang.ExceptionInInitializerError.

Probabilmente occorre installare o inizializzare ancora qualcosa. Qualche idea?

Grazie per l'attenzione,
Davide
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5