Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Запуск внешней программы из SQL-скрипта


Автор: stron 12.10.2006, 10:35
Собственно, как это сделать?
Или хотя бы в какую сторону копать?

Автор: LSD 12.10.2006, 10:40
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14357/ch12026.htm#sthref2314

Автор: stron 12.10.2006, 13:24
Чего-то я не понял как он работает smile
Не знает он команды Host, а как её включить я не понял

Автор: LSD 12.10.2006, 13:38
Дело в том, что host это не команда SQL, а команда SQL*Plus. Т.е. когда ты выполняешь из SQL*Plus скрипт, он парсит его и когда видит свои команды, то он их выполняет. Естественно host выполняется на том же компьютере что и сам SQL*Plus и от его имени. Другие SQL клиенты могут этого и не делать.
В Oracle нет стандартного способа выполнить команду ОС. Если надо выполнять команду на сервере, то надо писать хранимую процедуру на Java.

Автор: stron 12.10.2006, 13:54
Ok, тогда может подскажешь, как лучше реализовать такую задачу:
Мне раз в неделю надо заливать данные из файла в таблицу базы( 7-8 млн. записей ), далее, на основе этой таблицы производить расчёты и строить другие таблицы.
Записей достаточно много, поэтому хотелось бы перед каждой заливкой обнулять Sequence( возможно, производить ещё какие-нибудь действия ).

Мне видится такой алгоритм:
Создать в Oracle Job, который бы вызывал SP выполняющую: 
- подготовительные действия
- вызов SQL Loader'a
- вызов процедуры, производящей дальнейщие манипуляции

Автор: Paradox 12.10.2006, 14:29
реализуйте это не через job а через shell-скрипт, который сделает вам все эти вещи
ну или через виндовский шедулер и батник

Добавлено @ 14:31 
или вместо лоадера используйте external table

Автор: stron 12.10.2006, 14:50
Первое решение не нравится - хочу всё оставить в Оракле.
Пока буду смотреть в сторону 2-ого

Автор: 3x3 12.10.2006, 15:49
Цитата(stron @ 12.10.2006,  14:50)
Первое решение не нравится - хочу всё оставить в Оракле.
Пока буду смотреть в сторону 2-ого

А вот это зря. Случись что, админ может и не увидеть какое приложение впало в проблемы. В поддержке намного легче когда админ сразу видит, что процесс load_data_weekly.sh начинает процессор жрать, кушает слишком много памяти или, наоборот, висит ничего не делая, нежели этот процесс ему будет явлен как один из многочисленных oracle. 

Автор: Paradox 13.10.2006, 08:08
на самом деле действительно удобнее иметь все в БД, а не зоопарком припарок вокруг нее
а на джобы можно и сторожа поставить, чтобы ставили всех на уши, если джоб работает либо слишком долго, либо наоборот не поднялся в определенное время.

Автор: brabus 13.10.2006, 08:59
если правильно понял - требуется запустить внешнеее приложение из оракла? - возможно наиболее правильный вариант решения  с использованием java процы

Автор: 3x3 13.10.2006, 10:19
Цитата(Paradox @ 13.10.2006,  08:08)
на самом деле действительно удобнее иметь все в БД, а не зоопарком припарок вокруг нее
а на джобы можно и сторожа поставить, чтобы ставили всех на уши, если джоб работает либо слишком долго, либо наоборот не поднялся в определенное время.

Чем удобнее?
Необходимостью ставить каких-то "сторожей" на джобы? 

Автор: Paradox 13.10.2006, 10:34
удобнее в администрировании и переносах БД на другое железо
отследить работу джоба труда не составляет труда, а вот если таких скриптов становится много то жизнь админа сладкой не назовешь, хотя ее и так такой не бывает smile

Автор: stron 13.10.2006, 11:13
Всё-таки я придерживаюсь такого мнения, если функционал можно интегрировать в одном месте, то надо так и делать.

Автор: LSD 13.10.2006, 11:52
Цитата(3x3 @  13.10.2006,  11:19 Найти цитируемый пост)
Чем удобнее?

Можно управлять job-ом средствами Oracle, и использовать Resource Manager.

Выполнить команду ОС можно так:
Код
create or replace and compile java source named server_exec as
import java.io.*;

public class Test
{
  public static int exec(String command, String outLogFile, String errLogFile) throws IOException, InterruptedException
  {
    Process process = Runtime.getRuntime().exec(command);
    Spooller outSpooller = new Spooller(outLogFile, process.getInputStream());
    Spooller errSpooller = new Spooller(errLogFile, process.getErrorStream());
    outSpooller.start();
    errSpooller.start();
    return process.waitFor();
  }

  private static class Spooller extends Thread
  {
    private OutputStream out;
    private InputStream in;

    public Spooller(String fileName, InputStream in) throws FileNotFoundException
    {
      out = new FileOutputStream(fileName);
      this.in = in;
    }

    public void run()
    {
      byte[] buffer = new byte[32 * 1024];
      int read;
      try
      {
        while((read = in.read(buffer)) != -1)
          out.write(buffer, 0, read);
      }
      catch(IOException e)
      {}
      try
      {
        out.close();
      }
      catch(IOException e)
      {}
    }
  }
}

Код
create or replace function EXEC(command varchar2) return number as
language java name 'Test.exec(java.lang.String, java.lang.String, java.lang.String) return int';

Только надо будет еще дать все необходиые разрешения.

Автор: 3x3 13.10.2006, 15:02
Цитата(Paradox @ 13.10.2006,  10:34)
удобнее в администрировании и переносах БД на другое железо

Напротив, неудобнее.


Цитата

отследить работу джоба труда не составляет труда

Как определить сколько CPU кушает джоб в данный момент и сколько для него распределено памяти?

Цитата

а вот если таких скриптов становится много то жизнь админа сладкой не назовешь, хотя ее и так такой не бывает smile

Жизнь админа становится несладкой, когда он не в состоянии контролировать свою поляну. Вот вы какого админа имеете в виду? Админа ОС или админа БД?

Добавлено @ 15:07 
Цитата(LSD @ 13.10.2006,  11:52)
Выполнить команду ОС можно так:

Что бы выполнять команды ОС есть отличное от Oracle средство. Это средство - собственно ОС и есть. Десятилетиями ОС совершенствуются с целью сделать выполнение ими команд ОС как можно более надёжным, безопасным и контролируемым.  smile  smile  smile  

Автор: LSD 13.10.2006, 16:15
Цитата(3x3 @ 13.10.2006,  16:02)
Что бы выполнять команды ОС есть отличное от Oracle средство. Это средство - собственно ОС и есть. Десятилетиями ОС совершенствуются с целью сделать выполнение ими команд ОС как можно более надёжным, безопасным и контролируемым.  smile  smile  smile

Очень смешно, но совершенно не убедительно.

Автор: 3x3 13.10.2006, 17:53
Цитата(LSD @ 13.10.2006,  16:15)
Цитата(3x3 @ 13.10.2006,  16:02)
Что бы выполнять команды ОС есть отличное от Oracle средство. Это средство - собственно ОС и есть. Десятилетиями ОС совершенствуются с целью сделать выполнение ими команд ОС как можно более надёжным, безопасным и контролируемым.  smile  smile  smile

Очень смешно, но совершенно не убедительно.

То, что аргументы вас не убеждают, я знаю. Так что вы своей репликой меня не удивили.

Да и есть ли смысл пытаться кого-то убеждать в том, что расшибаться головой об стенку и писать всякие извращения с единственной целью заставить базу данных делать то, для чего она не предназначена? 

Моё дело - лишь обратить внимание вашей потенциальной жертвы на этот ньюанс, предостеречь человека, а дальше - это уж его дело, как ему проектировать систему  smile 

Автор: LSD 13.10.2006, 19:43
Цитата(3x3 @  13.10.2006,  18:53 Найти цитируемый пост)
Моё дело - лишь обратить внимание вашей потенциальной жертвы на этот ньюанс, предостеречь человека, а дальше - это уж его дело, как ему проектировать систему

Вот и молодец, предупредил о последствиях и достаточно. А как поступить решать автору топика.

На этом предлагаю закончить оффтопик (можешь считать это предупреждением).

Автор: Paradox 15.10.2006, 13:08
Цитата(3x3 @  13.10.2006,  18:02 Найти цитируемый пост)

Напротив, неудобнее.

ага smile хотел бы я посмотреть на вашего админа, когда он будет перетаскивать БД например с *NIX платформы на win, или наоборот
и что будет  при этом с кучей скриптов ОС, созданных вокруг БД

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)