Web Services Con Oracle

De Dos Ideas.
Saltar a: navegación, buscar

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: Getting Started with JAX-WS Web Services

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 JVM 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: Database Web Services Samples and How-To

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: JDBC, SQLJ, Oracle JPublisher and Universal Connection Pool (UCP)

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