Попытка вызвать ksh из процедуры plsql

Требуется выполнить test.ksh из процедуры с 4 входными переменными, требуется одно значение выходной переменной от скрипта к процедуре. Не могу найти в сети много информации об этом. Может ли кто-нибудь подсказать, как этого добиться.

После анализа я попробовал метод ниже, но все равно не повезло. Загружен ниже класса java в Oracle DB.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class KSHCommand {

public static String executeCommand(Long param1,String param2,Long param3, Integer param4) {

    StringBuffer output = new StringBuffer();

    Process p;
    try {
    String finalCommand = "Filesystempath/test.ksh";
        p = Runtime.getRuntime().exec(finalCommand);
        p.waitFor();
        BufferedReader reader = 
                       new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();

  }

}

test.ksh

out=`/usr/bin/java test`
echo $out

Ниже приведена функция, определенная для вызова java-метода.

    CREATE OR REPLACE FUNCTION testfun(param1 IN NUMBER,param2 IN   VARCHAR2,param3 IN NUMBER,param4 IN NUMBER) RETURN VARCHAR2 AS
    LANGUAGE JAVA NAME 'KSHCommand.executeCommand(java.lang.Long, java.lang.String, java.lang.Long,java.lang.Integer) return java.lang.String';
 /;

Ниже приведен запрос, возвращающий пустые данные.

 SELECT testfun(5,'test1',6,7) FROM DUAL;
  testfun()
  ------------------------------------------------

Если тот же файл java выполняется из файловой системы с использованием ./test.ksh, в терминале будет выведен тест.

Не могли бы вы сообщить мне, если что-то упущено, если скрипт выполняется из функции.

заранее спасибо


person Ganga    schedule 29.04.2016    source источник


Ответы (1)


Используйте пакет dbms_scheduler - для создания внешнего задания с 4 аргументами, передайте аргументы и затем запустите его. Короткий и понятный пример вы найдете здесь https://tinky2jed.wordpress.com/technical-stuff/oracle-stuff/creating-an-oracle-job-that-runs-an-os-исполняемыйфайл/ или здесь (для Windows, но он очень похож на UX) https://mikesmithers.wordpress.com/2012/06/12/running-a-windows-batch-file-from-dbms_scheduler/

person oratom    schedule 29.04.2016
comment
Да, я проверил, потому что в некоторой степени безопасности наша схема не имеет преимуществ для выполнения dbms_scheduler - person Ganga; 30.04.2016