На просторах Интеренета (а именно здесь) нашел следующий код:
try { Process p = Runtime.getRuntime().exec("Команда ОС"); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); System.out.println("Here is the standard output of the command:\n"); while ((s = stdInput.readLine()) != null) { System.out.println(s); } System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } } catch (IOException e) { System.out.println("exception happened - here's what I know:"); e.printStackTrace(); }Программа выполняет команду, а затем считывает стандартный выходной поток и поток ошибок.
Меня вполне все устроило, заиcключением того, что проблематично получить код ошибки, возвращаемый при завершении работы программы.
В Windows строка Runtime.getRuntime().exec("echo %errorlevel%")
всегда вернет "0" (насколько я понял, из рантайма вообще невозможно работать с переменными окружения, из за того, что в разных системах доступ к ним осуществляется по разному).
Поискав дальше нашел статью.
Т.е. код возвата программы можно получить:
System.out.println(p.exitValue());Теперь оформим в виде хранимой процедуры Oracle:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "os_execute" AS import java.io.*; public class os_execute { public static void main() throws IOException { String s = null; try { Process p = Runtime.getRuntime().exec("Команда ОС"); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); System.out.println("Here is the standard output of the command:\n"); while ((s = stdInput.readLine()) != null) { System.out.println(s); } System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } System.out.println(p.exitValue()); } catch (IOException e) { System.out.println("exception happened - here's what I know:"); e.printStackTrace(); } } }Таким образом на терминале отобразится текст, возвращаемый командной строкой, и код ошибки.
Код также будет работать и под Linux.
Данную процедуру можно переделать в функцию и возвращать результаты в выходном параметре.