(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.

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


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

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Personal Edition Named User Plus License
Oracle Database Personal Edition Named User Plus Software Update License & Support
Oracle Database Standard Edition 2 Processor License
Oracle Database Standard Edition 2 Named User Plus License
Nero Platinum 2018 VL 5 - 9 License corporate
 
Другие предложения...
 
Курсы обучения   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
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Кто, что знает за карту рассрочки Совесть? (1)
Иногда требуется купить что-то очень нужное, но выделить средства нет возможности. В этом случае...
 
Access, Ключевое поле, Счетчик (10)
Подскажите пожалуйста, как изменить в Access в ключевом поле (счетчик последовательно),...
 
Решение задач на оптимизацию с помощью MS Excel (4)
Zdravstvuyte, ya pro4itala danniy material, no ne smogla ponat kakie formuli ispolzovalis v...
 
Отличается ли ДрифтКазино от беттинга? (4)
Друзья, давно заметил, что на Дрифте уже несколько месяцев во всю рекламируется и предлагается...
 
Сайт инструмент (1)
Я бывший программист пользовался 1 сайтом проверенным он мне действительно помог я блогодоря...
 
 
 



    
rambler's top100 Rambler's Top100