(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Вызов shell из Oracle

Источник: habrahabr
igofed

Буквально на днях появилась у меня очень интересная задачка - вызвать shell скрипт из триггера в Oracle. Самым простым выходом в данной ситуации является хранимая процедура на Java, но редакция Oracle для которой было необходимо произвести действия - XE, в которой таковая возможность отсутствует.
Google выдает достаточно много советов по тому, как реализовать процедуру, ссылающуюся на C библиотеку, но в чистом виде такие инструкции у меня не заработали, пришлось несколько допиливать советы, в чем мне все также помогал Google. Ссылок на ресурсы, где я получал ответы, уже не помню, но всю цепочку действий попробую рассказать.

Итак, начинается все с создания необходимой С библиотеки, которая внутри системы и будет вызывать shell. Код библиотеки элементарный:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sh(char*);

void sh(char* cmd) {
    system(cmd);
}

После создания файла с исходным кодом из него необходимо скомпилировать саму либу, для чего воспользуемся gcc и ld. Допустим исходник имеет название shell.c. 

gcc -fPIC -DSHARED_OBJECT -c shell.c
ld -shared -o shell.so shell.o

Для меня, как для программиста на C# и Java оказалось сюрпризом, что чтобы все заработало либа должна быть собрана на операционке с той же разрядностью, что стоит на машине с Oracle.

У нас появилась библиотека, умеющая выполнять в shell то, что ей передадут параметром - отлично.

Слудующим шагом необходимо создать процедуру в Oracle. Начинаем этот шаг с того, что копируем получившуюся библиотеку в $ORACLE_HOME/bin - как показала практика, библиотека может не заработать, если будет находится по другому пути.
В самом Oracle создаем внешнюю библиотеку, меняя $ORACLE_HOME на путь.

create or replace library shell_lib is '$ORACLE_HOME/bin/shell.so';

Имея библиотеку - создадим процедуру, которая будет вызывать функцию этой библиотеки.
create or replace procedure shell(cmd IN char)
as external name "sh" library shell_lib language C parameters (cmd string);

На этом этапе в Oracle уже есть готовая процедура, которая вызывает shell, но для ее работы, возможно, потребуется донастроить сам Oracle - необходимо поправить листенер. Идем в$ORACLE_HOME/network/admin/, где открываем файл tnsnames.ora и проверяем в нем наличие описания для подключения по протоколу IPC, должно быть написано что-то вроде

EXTPROC_CONNECTION_DATA =
     (DESCRIPTION =
         (ADDRESS_LIST =
             (ADDRESS = (PROTOCOL = IPC)(KEY = extproc1)))
             (CONNECT_DATA =(SID = plsextproc)(PRESENTATION = RO))
         )

Если такой строки нет, то создаем ее, если есть, то смотрим на значение KEY и запоминаем его.
После чего открываем файл listener.ora, лежащий там же и проверяем наличие возможности подключения по протоколу IPC у листенера, к которому подключаетесь, настройка будет выглядеть как-то так:

(ADDRESS = (PROTOCOL = IPC)(KEY = extproc1))

Если такой настройки нет - добавляйте, если есть - сверьте значение KEY со значением из файла tnsnames.ora, они должны совпадать.
Если менялся хоть один файл tnsnames.ora или listener.ora - необходимо перезагрузить листенер:

lsnrctl stop
lsnrctl start

После осуществления этих нехитрых действий появляется возможность вызова shell из любой процедуры/функции/триггера в Oracle.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 03.09.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Standard Edition 2 Processor License
Oracle Database Personal Edition Named User Plus License
Oracle Database Standard Edition 2 Named User Plus License
Oracle Database Personal Edition Named User Plus Software Update License & Support
VMware Workstation 14 Player for Linux and Windows, ESD
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Вопросы и ответы по MS SQL Server
Windows и Office: новости и советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100