Как использовать функцию C ++ из хранимой процедуры Oracle

0

Я никогда не работал с Oracle, и я обычно использую только стандартные функциональные возможности SQL.

У меня есть общая библиотека C++, которую я скомпилировал с помощью GCC 4.2.4, и мне нужно вызвать ее функциональность из хранимой процедуры Oracle.

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

Должен ли я создавать функцию или что-то особенное в oracle, которое действительно вызывает код C++?

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

  • 1
    Да, это может быть сделано. Прошло много лет с тех пор, как я работал с Oracle, но я думаю, что Vershov предоставляет правильную ссылку. Следует помнить одну вещь: если вы планируете вызывать эту подпрограмму снова и снова, она может быть очень медленной из-за накладных расходов, связанных с вызовом внешнего кода. Иногда это необходимо, хотя так идти вперед.
Теги:

2 ответа

1

Короче. Oracle не позволит вам получить доступ к его адресному пространству. C хранимые процедуры работают иначе, чем в MySQL и PostgreSQL. Вы должны:

  • создать общую библиотеку, связать ее с клиентскими библиотеками Oracle и зарегистрировать ее, используя CREATE LIBRARY
  • настроить прослушиватель. Слушателю Oracle будет создан специальный процесс, называемый extproc (или extproc32). Этот процесс загрузит вашу общую библиотеку и поговорит с остальной частью Oracle через IPC.
  • Каждый раз, когда вы применяете патч к Oracle, вы также должны повторно связать свою общую библиотеку

Лучшим местом для запуска является установка сервера Oracle, содержащая образцы C OCI. Там вы найдете скелет такой общей библиотеки, а также Makefile который ее скомпилирует.

  • 0
    Когда вы говорите «связать его с Oracle», вы имеете в виду, что мне нужно создать его с помощью CC и добавить несколько библиотек Oracle в мой код? Также у меня есть C ++ SharedLibrary, а не C, будет ли она работать так же?
  • 0
    Боюсь, вы создали библиотеку оболочки C для библиотеки C ++ и связали эту библиотеку с библиотекой OCI. Эта библиотека OCI понадобится вам также для преобразования типов данных (int <=> OCINumber, std :: string <=> VARVHAR2)
1

Кажется, вам нужно использовать внешние процедуры Oracle.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню