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

в 3:47, , рубрики: oracle

После прочтения статьи Вызов 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js