Web Services Con Oracle
Vamos a ver como ejecutar un web service deployado en un Application Server desde Oracle SQL o PL/SQL.
Crear un Web Service
En primer lugar vamos a crear y deployar un Web Service sencillo utilizando el IDE NetBeans 6.5. Para realizar esto, seguir los pasos indicados en el siguiente tutorial: [1]
Como resultado obtendremos el Web Service CalculatorWS con la operacion Add, que recibe 2 parametros numericos y devuelve como resultado la suma de ambos numeros.
NOTA: Renombrar la operacion Add por Suma, porque ADD es una palabra reservada en Oracle y luego hay problemas al intentar ejecutar el Web Service desde la base de datos.
Verificar Oracle
En segundo lugar vamos a verificar si Oracle esta preparado para ejecutar un Web Service.
Como primer medida tenemos que verificar que la JVM este instalada dentro de la base de datos con la que vamos a trabajar.
Conectarse a la base de datos como un usuario DBA (puede ser SYS o SYSTEM) y realizar la siguiente consulta.
SQL> SELECT status, count(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE='JAVA CLASS' GROUP BY status;
Como resultado deben estar todos los objetos VALID y la cantidad ser mayor que 0.
En Oracle Database 10g
Oracle DBWS Callout Utility
Bajar Oracle DBWS Callout Utility 10.1.3.1 desde la siguiente URL: [2]
Deszipear el archivo de la siguiente manera:
% unzip dbws-callout-utility-10131.zip sqlj/* -d $ORACLE_HOME % unzip dbws-callout-utility-10131.zip samples/* -d $ORACLE_HOME/sqlj % unzip dbws-callout-utility-10131.zip README* -d $ORACLE_HOME/sqlj
Oracle JPublisher 10.2
Bajar JPublisher 10.2 desde la siguiente URL: [3]
Deszipear el archivo de la siguiente manera: % unzip jpub_102.zip sqlj/* -d $ORACLE_HOME
En Unix modificar el CLASSPATH en el script $ORACLE_HOME/sqlj/bin/jpub de la siguiente manera:
TMPCLASSPATH=$ORACLE_HOME/sqlj/lib/dbwsa.jar:$ORACLE_HOME/jdk/lib/dt.jar:\ $ORACLE_HOME/jdk/lib/tools.jar:$ORACLE_HOME/jlib/javax-ssl-1_2.jar:\ $ORACLE_HOME/jlib/jssl-1_2.jar:$ORACLE_HOME/jdbc/lib/ojdbc14.jar:\ $ORACLE_HOME/sqlj/lib/runtime12.jar:$ORACLE_HOME/jlib/orai18n.jar:\ $ORACLE_HOME/sqlj/lib/translator.jar:$ORACLE_HOME/javavm/lib/aurora.zip:\ $ORACLE_HOME/rdbms/jlib/xdb.jar:\ $ORACLE_HOME/lib/xsu12.jar:$ORACLE_HOME/rdbms/jlib/jndi.jar:\ $ORACLE_HOME/rdbms/jlib/aqapi.jar:$ORACLE_HOME/rdbms/jlib/jmscommon.jar:\ $ORACLE_HOME/lib/xmlparserv2.jar:$CLASSPATH export TMPCLASSPATH
En Windows agregar a la variable de ambiente CLASSPATH lo siguiente:
set CLASSPATH=%ORACLE_HOME%\sqlj\lib\dbwsa.jar;%ORACLE_HOME%\jdk\lib\dt.jar; %ORACLE_HOME%\jdk\lib\tools.jar;%ORACLE_HOME%\jlib\javax-ssl-1_2.jar; %ORACLE_HOME%\jlib\jssl-1_2.jar;%ORACLE_HOME%\jdbc\lib\ojdbc14.jar; %ORACLE_HOME%\sqlj\lib\runtime12.jar;%ORACLE_HOME%\jlib\orai18n.jar; %ORACLE_HOME%\sqlj\lib\translator.jar;%ORACLE_HOME%\javavm\lib\aurora.zip; %ORACLE_HOME%\rdbms\jlib\xdb.jar; %ORACLE_HOME%\lib\xsu12.jar:%ORACLE_HOME%\rdbms\jlib\jndi.jar; %ORACLE_HOME%\rdbms\jlib\aqapi.jar;%ORACLE_HOME%\rdbms\jlib\jmscommon.jar; %ORACLE_HOME%\lib\xmlparserv2.jar:%CLASSPATH%
Version de Java
La base de datos Oracle 10g tiene embebida una JVM version 1.4, por lo tanto todas las clases que carguemos en la base de datos deben ser compiladas con JDK 1.4
Por lo tanto antes de continuar aseguremonos que esta version es la que esta en el PATH: % export PATH=$ORACLE_HOME/jdk/bin:$ORACLE_HOME/sqlj/bin:$PATH
Load WebService Client en la Base
Si estamos en Oracle Database Server 10g Release 1 (10.1)
% loadjava -u usuario/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb101.jar
Si estamos en Oracle Database Server 10g Release 2 (10.2)
% loadjava -u usuario/password -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar
NOTA: usuario/password Podríamos cargar el WebService Client en el usuario SYS, pero si en algun momento queremos borrarlo, nos conviene que este separado en otro esquema, por ejemplo DBWSCLI.
Permisos
Con SQL*Plus dar los privilegios necesarios con un usuario DBA:
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'shutdownHooks', ); SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.util.logging.LoggingPermission', 'control', ); SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:java.lang.RuntimePermission', 'setFactory', );
Si al ejecutar el JPublisher da error, mirar los trace de la base de datos para ver como solucionarlo. En el caso del ejemplo que vamos a ejecutar, dio un error, y tuve que agregar el siguiente privilegio:
SQL> call dbms_java.grant_permission( 'SCOTT', 'SYS:oracle.aurora.security.JServerPermission', 'LoadClassInPackage.java.lang.StringBuilder', );
Usando el JPublisher
Tener seteadas las variables de ambiente. ORACLE_HOME; ORACLE_SID; PATH; CLASSPATH segun se detallo mas arriba.
jpub -u scott/tiger -sysuser system/****** -proxywsdl=http://localhost:8080/CalculatorWSApplication/CalculatorWSService?WSDL -endpoint=http://localhost:8080/CalculatorWSApplication/CalculatorWSService -package=prueba -dir=prueba
NOTA: si con localhost no funciona reemplazar por el hostname.
Ejecutando el Test
sqlplus scott/tiger
SQL> select jpub_plsql_wrapper.suma(37,30) from dual;
Resultado: 67