Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
добрый день!

Необходимо выполнить команду линукс из PL/SQL процедуры (11g)
Пытаюсь при помощи dbms_pipe.send_message, но не пойму как получить ответ команды который является текстом (строкой)?
18 мар 17, 09:14    [20308341]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
DBMS_PIPE -- это не каналы OS, это внутренняя кухня оракла

А у тебя богатый выбор -- от DBMS_SCHEDULER, external tables, Java и до написания внешних процедур
18 мар 17, 09:19    [20308346]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Выбор настолько богатый что не могу выбрать никак
Что лучше использовать для простого действия - отправка команды, получение ответа в Varchar?
18 мар 17, 09:20    [20308347]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Ну, смотря что за команда
В самом простом случае -- команда не ждет и не обрабатывает аргументов
tst> create table pwd(str varchar2(256))
  2  organization external (
  3  type oracle_loader
  4  default directory tmp_dir
  5  access parameters (
  6  records delimited by newline
  7  preprocessor bin_dir:'pwd'
  8  )
  9  location ('.')
 10  );

Table created.

tst> select * from pwd;

STR
-------------------------------------------
/u/app/oracle/product/11gr2/dbs

tst> 
С аргументами, через создание shell-файлика тут, там же и определены TMP_DIR, BIN_DIR
18 мар 17, 09:48    [20308363]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Спасибо за помощь!

Мне нужно узнать IP сервера Оракл из хранимой процедуры
18 мар 17, 10:50    [20308402]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
А зачем внешняя процедура?
SQL> select utl_inaddr.get_host_address(host_name) from v$instance;

UTL_INADDR.GET_HOST_ADDRESS(HOST_NAME)
------------------------------------------------------------------------
192.168.210.6
В 11 надо будет еще дать право 'resolve' через dbms_network_acl_admin
18 мар 17, 11:12    [20308417]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Elic
Member

Откуда:
Сообщений: 29990
Вячеслав Любомудров
select utl_inaddr.get_host_address(host_name) from v$instance;
dual
18 мар 17, 11:19    [20308424]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Вячеслав Любомудров,

Дело в том, что возвращается неверное значение.
Мне нужно чтоб вернулся тот IP который указан в tnsnames, для подключения, а возвращается IP standby сервера, почему-то
18 мар 17, 11:45    [20308481]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Это как-то странно
А как подсказывает Elic (конспиратор, блин), без аргумента тоже фигню выдает?
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_inaddr.htm#ARPLS71181
18 мар 17, 11:52    [20308495]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Elic
Member

Откуда:
Сообщений: 29990
Mr_Muscle
Мне нужно чтоб вернулся тот IP который указан в tnsnames, для подключения
В общем случае на стороне сервера узнать адрес, использованный клиентом для tcp/ip подключения, затруднительно.
18 мар 17, 12:18    [20308537]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Делаю DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_NAME);
Получаю 'pluton'
Делаю DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS('pluton')); или DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS);
Получаю 22 IP, хотя в tns стоит 21

Не могу понять как так получается

Elic, да, и поэтому возникла идея может можно команду оси запустить из процедуры.
18 мар 17, 12:26    [20308553]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
А со стороны сервера БД тот-же ping pluton про какой адрес говорит?
Я легко могу на сервере в /etc/hosts прописать любой другой адрес, а не тот, который резолвится, например, через DNS

А так, да -- сервер может иметь несколько адресов
В RAK-е могут быть еще и виртуальные адреса

Тут в общем-то надо скакать от твоей задачи, а не решать часть ее -- получение какого-то адреса (тем более, если ты знаешь имя)
18 мар 17, 12:34    [20308570]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
В принципе, можно еще парсить вывод V$LISTENER_NETWORK, но он тоже не дает информации о всех слушающих адресах
18 мар 17, 12:39    [20308579]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Elic
Member

Откуда:
Сообщений: 29990
Mr_Muscle
Elic, да, и поэтому возникла идея может можно команду оси запустить из процедуры.
Ты не понял. Между клиентом и сервером может быть куча NAT-ов.
18 мар 17, 12:40    [20308580]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Вячеслав Любомудров,

на стороне сервера возвращается 21

Задача в целом такая, в хранимых процедурах находится довольно много почтовых рассылок.
Нужно сделать так, чтобы в случае создания клона базы или если будет происходить синхронизация баз, в эти почтовые рассылки добавлялась строка которая бы позволила понять, с какого сервера почта приходит.
18 мар 17, 12:40    [20308581]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Почему именно адрес, а не имя?
Или даже имя БД (если, конечно, на клонах другие имена)
18 мар 17, 13:24    [20308645]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Потому что все знают только IP, имена то одинаковые..некоторые на 1 букву отличаются. Менять их никто не станет. Не информативно получится. А так 4 копии БД, боевая, 2 тестовых и резервная. Вот недавно подняли админы клон - потестировать что-то себе. Так мы, разработчики, головы сломали откуда же к нам уведомления на почту сыпятся.
18 мар 17, 13:36    [20308662]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10776
В заголовках писем, если почтарь не занимается анонимизацией, прекрасно видны IP-адрес и имя хоста-отправителя.
18 мар 17, 13:40    [20308672]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Basil A. Sidorov,

Клиент - обычный Outlook, получатели - не только разработчики но и обычные юзеры, которым тоже важно знать уведомления с боевого сервера, резервного или тестовго.... к сожалению не вижу как мне могут помочь заголовки письма?
18 мар 17, 13:43    [20308683]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Mr_Muscle
Делаю DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_NAME);
Получаю 'pluton'
Делаю DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS('pluton')); или DBMS_OUTPUT.PUT_LINE(UTL_INADDR.GET_HOST_ADDRESS);
Получаю 22 IP, хотя в tns стоит 21
Я бы все-таки попытался разобраться в ситуации
Возможно, с привлечением сисадмина
18 мар 17, 13:49    [20308695]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Вячеслав Любомудров,

т.е. это ненормально?
18 мар 17, 13:50    [20308697]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10776
Задача: "Вставить пистон админам, которые подняли стенд, не поменяв настройки системы уведомления".
Решение: увидев уведомление, "которого не должно быть" включить отображение служебных заголовков, найти IP-адрес отправителя и подойти для раздачи люлей.
Проблема: Никто в компании разработчиков никогда не видел служебных заголовков писем и не знает как их отобразить.
Решение проблемы: пригласить (нанять) сисадмина или даже толкового хелпдескера.

P.S. Уж простите мой сарказм, но даже аутглюке можно посмотреть заголовки писем. Не так удобно, как нормальном почтовом клиенте, но тоже можно.
18 мар 17, 13:52    [20308703]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Mr_Muscle
Вячеслав Любомудров,

т.е. это ненормально?
Если у тебя там standalone-база, не RAC, т.е. у тебя один узел, то это, естественно, не нормально
Собственно, даже в случае с RAC-ом резолвинг по имени хоста не должен быть неправильным
18 мар 17, 14:03    [20308714]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить команду ОС из процедуры  [new]
Mr_Muscle
Member

Откуда:
Сообщений: 108
Basil A. Sidorov,

Про заголовки как-то не подумалось в тот момент )) Спасибо за наводку!
Админы люлей получили в силу возможностей
Разработчиков, надеюсь, еще можно чему-то научить.
18 мар 17, 14:04    [20308718]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить