После прочтения статьи Вызов shell из Oracle
Я решил поделиться своим решением данной проблемы. Для решения задачи применяется Javaб поэтому на Oracle XE данный солюшен работать не будет.
Зато данное решение кросс платформенно — работает на всех ОС с которыми мне приходилось сталкиваться.
А так же позволяет видеть результаты выполнения внешной команды в DBMS_OUTPUT.
Приступим к реализации:
Шаг 1: создаем на базе исходник на Java.
import java.lang.*;
import java.io.*;
import java.sql.SQLException;
public class Host {
public static void executeCommand (String command) throws SQLException,IOException
{
#sql {
begin
DBMS_JAVA.set_output (10000000);
end;
};
String uFullCommand = ""; String nameOS = System.getProperty(«os.name»);
if ((nameOS.toLowerCase()).indexOf(«lin») != -1)
{
uFullCommand = "/bin/sh" + " -c " + command;
}
else if ((nameOS.toLowerCase()).indexOf(«win») != -1)
{
uFullCommand = "%systemroot%\system32\cmd.exe" + " /y" + " /c " + command;
}
else if ((nameOS.toLowerCase()).indexOf(«nix») != -1)
{
uFullCommand = command;
}
else
{
uFullCommand = command;
}
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(uFullCommand);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null)
{
System.out.println(line);
}
}
};
Шаг 2: оборачиваем в PL/SQL.
CREATE OR REPLACE
PROCEDURE host_command_proc (p_command IN VARCHAR2) AS
LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
Пример вызова:
begin
host_command_proc («ls /tmp»);
end;
И да идея данного решения заимствованна у Тома Кайта.
Автор: Anton_DS