Pull to refresh

Вызов shell из Oracle альтернативный метод

Reading time 1 min
Views 5.1K
После прочтения статьи Вызов 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;


И да идея данного решения заимствована у Тома Кайта.
Tags:
Hubs:
+5
Comments 10
Comments Comments 10

Articles