En este artículo trataremos un tema muy interesante como es “lanzar ejecutables desde PLSQL con JAVA”.
Para probar esto hemos creado un ejecutable en c, que ejecutaremos desde Oracle, que genera un fichero de salida. Para realizar esto utilizaremos Java:
Crearemos un objeto Java en BBDD:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED “OSCommand” AS
import java.io.*;
public class OSCommand{
public static String Run(String Command){
try{
Runtime.getRuntime().exec(Command);
return(“0″);
}catch (Exception e){
System.out.println(“Error running command: ” + Command + “\n” + e.getMessage());
return(e.getMessage());
}
}
}
Una vez que tenemos listo el programa de Java debemos integrarlo con PL/SQL. Esto se realiza a través de subprogramas de recubrimiento llamados Wrappers. No podemos crear un Wrapper en un bloque anónimo y hay que crear uno por cada función java que queramos ejecutar desde PL/SQL.
CREATE or REPLACE FUNCTION OSCommand_Run(Command IN STRING)
RETURN VARCHAR2 IS
LANGUAGE JAVA
NAME ‘OSCommand.Run(java.lang.String) return int’;
Una vez creado el wrapper, podremos ejecutarlo como cualquier otra funcion o procedure de PL/SQL, incluso desde un bloque anónimo.
DECLARE
x Varchar2(2000);
Begin
x := OSCommand_Run(‘RUTA/hola’);
DBMS_OUTPUT.Put_Line(substr(x,1,200));
End;
/
Como veis, he limitado el DBMS_OUTPUT a 200, por si da error y así no se satura el buffer.
Si al ejecutarlo os dan problemas tipo:
The PL/SQL to grant this is dbms_java.grant_permission( ‘ESQUEMA’, ‘SYS:java.io.FilePermission’, ‘RUTA/hola’, ‘execute’ )
Tendréis que dar permisos para la ejecución (siempre que tengáis privilegios).
execute dbms_java.grant_permission( ‘ESQUEMA’,’SYS:java.io.FilePermission’,’*’, ‘read ,write, execute, delete’);
grant JAVASYSPRIV to <USUARIO>
Es muy importante que pongais el usuario SYS y el nombre del esquema en mayúsculas.