RE:Ejecutar shell con un PLSQL
Lo que tienes que hacer es crear un procedimiento almacenado en Java, Java si tiene una forma para correr ejecutables.
La idea es mas o menos la siguiente:
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());
}
}
}
/
/***************************/
CREATE or REPLACE FUNCTION OSCommand_Run(Command IN STRING)
RETURN VARCHAR2 IS
LANGUAGE JAVA
NAME 'OSCommand.Run(java.lang.String) return int';
/
/****************************/
--
-- EJECUTAR COMO SYS --
--
/****************************/
Execute dbms_java.grant_permission( '<USUARIO>','SYS:java.io.FilePermission','<<ALL FILES>>','execute');
execute dbms_java.grant_permission( '<USUARIO>','SYS:java.lang.RuntimePermission','writeFileDescriptor','*' );
execute dbms_java.grant_permission( '<USUARIO>','SYS:java.lang.RuntimePermission','readFileDescriptor','*' );
/****************************/
grant JAVASYSPRIV to <USUARIO>
/
exec call dbms_java.grant_permission('<USUARIO>','java.lang.RuntimePermission','loadLibrary.*',null);
/
--
-- Esta es la forma de llamarlo
--
DECLARE
x Varchar2(2000);
Begin
x := OSCommand_Run('d:/scripts/comando.bat');
DBMS_OUTPUT.Put_Line(x);
End;