Me ha llamado la atención un comentario que me han dejado en el blog preguntando bajo que condiciones deberÃamos utilizar PL/SQL en lugar de SQL. En realidad, soy incapaz de responder. No hay una frontera clara, aunque la podamos establecer de forma intuitiva. Establezcamos unas propuestas básicas de buenas prácticas:
1. Utilizaremos SQL si la acción a realizar no se va a repetir
2. Utilizaremos SQL si no podemos establecer una regla que nos permita determinar cual será la próxima acción
Es decir, yo creo que debemos utilizar el lenguaje SQL si es una acción no sistemática sobre la base de datos (crear una tabla, realizar una carga inicial de datos, …) o si no podemos prever el resultado y actuar en consecuencia. Por ejemplo, borrar un empleado de la base de datos. Mediante SQL comprobaremos qué acciones realizar en cada momento en función de los resultados anteriores.
Para todo lo demás, PL/SQL. Creo que, aunque el PL/SQL esté compuesto de un único SQL, es recomendable utilizar un lenguaje procedural que nos permita encapsular, esconder, abstraer al fin, la lógica de la acción. De esta forma creamos una interfaz entre el sistema y el usuario (sea quien sea) que evita tener que resolver un problema ya resuelto.
En cualquier caso, siempre he pensado en ambos como en una unidad. No me planteo el uso del uno sin el otro. Es, por asà decirlo, una llave doble, una herramienta múltiple, una navaja suiza. No es conveniente plantearse cuál es mejor, sino como aplicar cada uno a la solución del problema.
Denise mañana empieza a dar este curso, y dejo los apuntes (transparencias y documento de seguimiento) para que los alumnos puedan seguirlo sin problema.
Ayer estuve mirando la forma de ejecutar un código en Java desde PL/SQL. Llegué rápido a una respuesta, pero no me convenció. El mecanismo es muy simple: se compila la clase Java en el entorno de Oracle y se define un procedimiento que llama a un método de la clase. A partir de ese momento, el método y el procedimiento quedan ligados. En esta página está muy bien explicado. Yo simplemente pondré las instrucciones para compilar y ligar el método al procedimiento (todo desde Oracle).
CREATE OR REPLACE AND COMPILE
JAVA SOURCE
NAMED FuentesJava
AS
public class OracleJavaClass
{
public static String Saluda(String nombre)
{
return ("Hola desde Java" + nombre);
}
};
CREATE OR REPLACE
FUNCTION Saluda_wrap (nombre VARCHAR2)
RETURN VARCHAR2
AS
LANGUAGE JAVA NAME
'OracleJavaClass.Saluda(java.lang.String) return java.lang.String';
Pues bien. Me parece que no es lo más conveniente seguir este método. No creo que la mejor solución sea compilar la clase en el propio entorno Oracle. A mi lo que me gustarÃa es crear una clase pública que pudiera ser llamada desde PL/SQL. Asà podré utilizar una única clase independientemente del entorno.
Es un poco más complicado, pero también se puede hacer. Imaginemos que creamos una clase:
public class Hello
{
public static String world()
{
return "Hello world";
}
}
Después de compilarla con el javac (como cualquier clase normal), la tenemos que asociar a un usuario Oracle. Esto lo hacemos ejecutando la instrucción desde la lÃnea de comandos:
C:>loadjava -user usuario/pass@bbdd -oci8 -resolve -noverify Hello.class
Donde, evidentemente, usuario es el nombre del usuario de la base de datos, pass el password y bbdd el descriptor. Lo más probable es que tengas como resultado un error de permisos. Para solucionarlo, debes lanzar desde el usuario SYS:
begin
dbms_java.grant_permission(
'USUARIO','SYS:oracle.aurora.security.JServerPermission','Verifier', ''
);
end;
Vuelves a lanzar el loadjava, y si todo va bien, ya tienes acceso a la clase desde el entorno Oracle. Como último paso debemos ligar el método a un procedimiento (le llamaré Hello en un alarde de originalidad):
create or replace function hello return varchar2 as
language java name 'Hello.world() return java.lang.String';
Comprobamos que todo esté correcto:
select object_name, object_type, status
from user_objects
where object_type like '%JAVA%'
Y si el status es válido, ya podemos llamar a la función Hello como a cualquier otra función PL/SQL:
select hello from dual
Javier Jofre (12-May-2010)
Gracias a O'Reilly, podemos asistir vÃa online y de forma gratuita a algunos cursos sobre desarrollo en Java para Android. Próximamente (en unos dÃas) empieza el curso de creación de un cliente twitter. Espero que lo disfrutéis.