Вызов внешней C библиотеки из PL SQL

1. Напишите и откомпилируйте файл myC.c файл (в зависимости от операционной системы команда может быть разной)
gcc -m64 myC.c — fPIC -G -o myC.so

2. Полученный бинарный файл .so (shared object) расположить в каталог, из которого Oracle мог бы его извлечь, например рядом с другими бинарными библиотеками, которые уже используются

3. Модифицировать listener.ora (возможно еще и tnsnames.ora), добавив путь до библиотеки в EXTPROC_DLLS:
(ENVS=»EXTPROC_DLLS=/path/to/myC.so:/another/lib/ll.so:…»)

4. Перезапустить listener, выполнив команды
lsnrctl stop listener
lsnrctl start listener

5. Проверить статус listener, выполнив команду lsnrctl status listener

6. Создать библиотеку PL SQL под пользователем SYS:
CREATE OR REPLACE LIBRARY MY_LIB_NAME AS ‘/path/to/myC.so’;

7. Создать PL SQL пакет для вызова процедур, функций из внешней библиотеки

CREATE OR REPLACE PACKAGE BODY DS_Package AS 
     FUNCTION DS_Findmin(data  CLOB) RETURN PLS_INTEGER IS EXTERNAL 
     NAME "c_findmin" LIBRARY MY_LIB_NAME LANGUAGE C WITH CONTEXT; 
     FUNCTION DS_Findmax(data CLOB) RETURN PLS_INTEGER IS EXTERNAL 
     NAME "c_findmax" LIBRARY MY_LIB_NAME LANGUAGE C WITH CONTEXT; 
   END;

Таким образом можно вызывать си (C) функции из PL SQL