Extproc oracle что это

Обновлено: 06.07.2024

Функции SQL ST_Geometry и ST_Raster в Oracle используют общие библиотеки, доступ к которым выполняется через агент внешней процедуры Oracle или extproc. Для использования SQL с ST_Geometry или ST_Raster, а также выполнения доступа к столбцам ArcSDE XML в видах GDB_ITEMS_VW и GDB_ITEMRELATIONSHIPS_VW, Oracle должен иметь возможность доступа к библиотекам. Поэтому библиотеки должны присутствовать на сервере Oracle и вызываться через среду внешней процедуры Oracle.

Использование ST_Geometry и ST_Raster в ArcGIS возможно без настройки extproc в Oracle. Однако вы не будете обладать всей функциональностью клиентов ArcGIS, а также функциональностью клиентов SQL, например SQL*Plus. Например, вы не сможете использовать функции SQL в столбцах ST_Geometry слоев запроса ArcMap, идентифицировать пространственные объекты в представления баз данных, создавать версионные таблицы, содержащие столбцы ST_Raster, удалять строку, содержащую столбец ST_Raster, публиковать сервисы объектов, содержащие данные ST_Geometry, или исполнять функции SQL из клиентов SQL без настройки extproc в Oracle.

Примечание:

Если ваша база данных Oracle установлена на сервере Windows, вам может понадобиться установить пакет Microsoft Visual C++ 2008 SP1 Redistributable Package (x64). Если на сервере Oracle нет пакета Microsoft Visual C++ 2008 SP1 Redistributable Package (x64), загрузите его с сайта Microsoft и выполните установку.

Если вы используете Oracle 11g или 12c, выполните редактирование файла extproc.ora для вызова функций с использованием среды внешней процедуры Oracle. Если вы используете Oracle 10g, выполните конфигурирование приемника Oracle.

Oracle 11g и 12c

Oracle рекомендует выполнять настройку extproc редактированием файла extproc.ora, вместо настройки listener для Oracle 11g и 12c. Файл extproc.ora расположен в директории ORACLE_HOME\hs\admin.

  1. Сделайте резервную копию файла extproc.ora на сервере Oracle.
  2. Откройте extproc.ora и измените его, чтобы указать местоположение библиотек ST_Geometry (st_shapelib) и/или ST_Raster.

В этом примере на сервере Windows, для указания библиотеки ST_Geometry в папке mylibraries добавляется следующая строка:

Если вы используете обе библиотеки, ST_Geometry и ST_Raster, вы можете ввести их в одной строке:

В этом примере на сервере Linux или UNIX, для указания библиотеки ST_Geometry в папке пользователя esrilibs, которая была создана на сервере Oracle для хранения библиотеки, добавляется следующая строка:

Если вы используете обе библиотеки, ST_Geometry и ST_Raster, вы можете ввести их в одной строке:

Oracle 10g

Основным моментом конфигурирования приемника является указание extproc места хранения общих библиотек. Вам необходимо изменить конфигурацию приемника для указания расположения общих библиотек, а затем перезапустить процесс приемника Oracle для вступления в силу изменений конфигурации.

Применяется два стандартных файла конфигурации приемника Oracle: tnsnames.ora и listener.ora. Обычно эти файлы находятся по пути ORACLE_HOME/net/admin. Настоящий документ содержит необходимые параметры конфигурации.

Существует несколько способов управления параметрами. Вы можете выполнить редактирования текстовых файлов с применением текстового редактора, использовать Oracle Net Manager или Oracle Net Configuration Assistant. Компания Oracle предоставляет документацию по конфигурированию приемника. Дополнительные сведения см. в руководстве администратора Oracle Database Net Services.

Файл tnsnames.ora содержит папку известных сервисов базы данных. Данный файл может определять сервисы в локальной базе данных или на удаленных серверах. Одна запись применяется специально для сервера локальной базы данных с целью использования связи между процессами (IPC) для отправки вызова функции к extproc. Данная запись называется EXTPROC_CONNECTION_DATA. В данной записи вы можете изменять значения ключа и SID.

Данные элементы используются для связи указанной записи с соответствующей информацией в файле listener.ora. Ключом может быть любое короткое имя, но оно должно совпадать в файлах listener.ora и tnsnames.ora. Для данных значений учитывается регистр. Они используются только процессом приемника, а не пользователями или приложениями.

Файл listener.ora описывает некоторые (не обязательно все) сервисы, для которых приемник осуществляет прием запросов.

В данном файле можно изменять следующие значения:

Данной подписью начинается список SID, управляемый приемником с именем LISTENER (имя приемника по умолчанию).

Записи SID_DESC под заголовком SID_LIST определяют сервисы. Первый в списке управляет запросами extproc, второй управляет сеансами клиента.

Значение для данного параметра должно соответствовать SID, указанному для extproc в файле tnsnames.ora.

Определяет расположение Oracle home для данного сервиса. Файлы программы extproc загружаются из папки, указанной в данном месте.

Указывает имя исполняемого файла extproc. Данное имя учитывает регистр и может быть extproc или extproc.exe в зависимости от типа операционной системы. Файл расположен в ORACLE_HOME/bin.

Это перечень переменных среды, которые использует во время работы extproc. Список разделяется двоеточием. Данный список должен включать в себя определение переменной среды EXTPROC_DLLS и остальных переменных среды, необходимых для работы extproc, к ним обычно относятся LD_LIBRARY_PATH, SHLIB_PATH или LIBPATH для UNIX и Linux систем, а также PATH для серверов Windows. Переменная пути path обычно содержит расположение библиотек геометрии и параметров проекции.

Эта переменная среды определяет список библиотек, которые может загружать extproc и из которых он может выполнять прямой вызов функций. Путь к файлу, содержащему библиотеку геометрии, которая необходима для доступа к типам ST_Geometry или для просмотра GDB_ITEMS_VW и GDB_ITEMRELATIONSHIPS_VW с помощью SQL, и библиотеку st_raster, необходимую для доступа к типу ST_Raster с помощью SQL, задается здесь.

Список разделен двоеточием для серверов Oracle, установленных на UNIX, и точкой с запятой для серверов Oracle, установленных на Windows. Все пути должны быть абсолютными и указывать на локальные директории или путь UNC, к которому имеет доступ пользователь системы Oracle. Это также означает, что если вы установили сервер приложения ArcSDE на сервер, отличный от Oracle, то вы должны выполнить копирование библиотек формы и растра из папки bin в SDEHOME на сервер Oracle.

Подстановка переменной среды не доступна.

Для ослабления или ограничения использования extproc файлов библиотеки возможно использование дополнительных ключевых слов ANY и ONLY. Если вы укажите в начале пути ключевое слово ANY, Oracle сможет загрузить любую библиотеку по указанному пути, имя библиотеки указывать не нужно. Если вы укажите в начале пути ключевое слово ONLY, Oracle сможет загрузить только ту библиотеку, путь к которой вы указали.

Значение, присваиваемое данному элементу, используются для связи данного приемника с соответствующей записью сервиса в файле tnsnames.ora. Он используется для того, чтобы отличить данный приемник от других приемников IPC, которые могут находиться на одном сервере базы данных. Ключом может быть любое короткое имя, но оно должно совпадать в файлах listener.ora и tnsnames.ora. Ключ чувствителен к регистру.

  1. Перед внесением любых изменений сделайте резервные копии файлов tnsnames.ora и listener.ora.
  2. Откройте файл tnsnames.ora на сервере Oracle.
  3. Измените значения Key и SID в EXTPROC_CONNECTION_DATA файла tnsnames.ora.

Данная запись должна всегда иметь подпись EXTPROC_CONNECTION_DATA. Данная запись используется сервером базы данных для связи между процессами с целью отправки вызова функции к extproc.

Этот первый пример предназначен для ОС Windows, библиотеки ST_Geometry и ST_Raster находятся в папке gislibs:

На этим примерах показана строка для серверов Linux или UNIX, на которых библиотеки ST_Geometry и ST_Raster находятся в /arcgis/libs :

Сразу скажу, что теперь можно одновременно использовать как 32 так и 64 разрядные внешние процедуры, а разобравшись в проблеме конфигурирование выполняется весьма несложно.

Столкнувшись с необходимостью организовать работу библиотек используемых ранее на 32 разрядом Oracle обнаружил, что в новой версии Oracle данный аспект сильно изменен в отличие от предшествующих версий.


Конфигурирование было выполнено для следующих компонентов:
• Windows 2008 R2 64-bit
• Oracle 11g R2 64-bit
• Oracle Instant Client 11.2.0.2 32-bit

Вот перечень некоторых отличий настройки от предшествующих версий Oracle:
• extproc32.exe – теперь не используется;
• оснастку Instant Client теперь необходимо устанавливать в отдельный ORACLE_HOME;
• появился новый конфигурационный файл настройки extproc — %ORACLE_HOME%\hs\admin\extproc.ora;
• файлы логов LISTNER размещаются в — %ORACLE_HOME%\diag\tnslsnr\[hostname].

Приступим к настройке Oracle

Первое, что необходимо сделать – выполнить выборочную установку 32-bit Oracle Instant Client. Достаточно выбрать для установки: Oracle Database Utilities и Oracle Net Listener. В качестве пути установки я установил: [диск]:\oracle\product\11.2.0\client_32. В завершении установки автоматически будет запущен Net Configuration Assistant – которым, рекомендуется воспользоваться, что бы избежать впоследствии возможных ошибок, как например использование утилиты netca, которая будет запущена для конфигурирования прослушивателя (LISTNER) из ORACLE_HOME по умолчанию, а он окажется 64-разрядный.

Опишу процесс настройки нового прослушивателя через Net Configuration Assistant:

• В окне конфигурации выбрать пункт: Listener configuration и далее
• Выбрать Add и далее
• Задать имя LISTENER_32 и далее
• Из колонки Selected Protocols убрать протокол TCP и добавить протокол IPC и далее
• Ввести в поле IPC Key value: IPC_EXT32 и далее
• Отказаться от конфигурирования другого прослушивателя и далее, далее, готово

После завершения работы Net Configuration Assistant, можно проверить сформировавшийся файл конфигурации прослушивателя %ORACLE_HOME%\client_32\NETWORK\ADMIN\listener.ora, выглядеть он должен так, как указано в примере, разве что за исключением пути до директории Oracle:


Последнее, о чем стоит упомянуть в описании системной конфигурации – это новый файл конфигурации extproc.ora. Данный файл необходимо сконфигурировать как в 32-bit, так и в 64-bit инстансах Oracle. Конфигурационный файл, оснащен вполне исчерпывающим описанием конфигурации, и я лишь приведу пример настройки. Самое простое, это указать значение параметра EXTPROC_DLLS=ANY; либо указать точный путь, используя опцию ONLY:[MY_PATH\my.dll].

Особенности конфигурирования библиотеки Oracle

Для 64-bit библиотек всё остается, без каких либо изменений, но для указания Oracle, какие библиотеки необходимо запустить, используя 32-bit extproc, необходимо создать символическую ссылку и переконфигурировать скрипт создания библиотеки.

Из соображений безопасности я попросил команду DB добавить EXTPROC_DLLS:ONLY; но они сказали это:

"Пожалуйста, имейте в виду, что KEY = EXTPROC1526 вообще не относится ни к какому внешнему процессу. Это просто ключ, используемый любым процессом, который должен вызвать Oraxxx по протоколу IPC. Ключ может быть любым значением и одним и тем же значение ключа должно быть передано через tnsnames.ora"

Мне это кажется неправильным. Не могли бы вы пожалуйста помочь мне в этом? Каково точное использование EXTPROC и что произойдет, если мы не добавим EXTPROC_DLLS:ONLY?

2 ответа

В Mysql, если мы вставим, удалим или обновим данные, то с помощью mysql_affected_rows(), мы получим количество строк, затронутых &, которые мы можем использовать в PHP для хранения их в variable . Так что же такое Oracle эквивалент mysql_affected_rows? Как мы можем получить количество строк.

Для любой программы для подключения базы данных oracle вам нужен агент Extproc.

Например, PLS/SQL нуждается в Extproc для работы с oracle

Более подробную информацию о секьюрити вы можете найти здесь
Больной прошел мимо какой-то связи

В отличие от других баз данных Oracle не позволяет плагинам получить доступ к собственному адресному пространству памяти. В случае MySQL/PostgreSQL плагин .dll (хранимая процедура C) загружается основным процессом базы данных.

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

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

Эта опция может ограничить путь для .dlls, загружаемых extproc, т. е. тех, которые создаются оператором CREATE LIBRARY .

PS: использование C хранимых процедур VERY редко, если вы не используете их, вы можете свободно удалить всю строфу extproc из listener.ora.

PS1: существует возможный сценарий использования функции extproc .

  • Пользователь должен иметь CREATE LIBRARY , который обычно предоставляется NOT
  • extproc не настроен для работы с ничьими привилегиями, но работает как oracle:dba
  • Пользователь создает вредоносную библиотеку .so, которая будет выполнять что-то "evil" во время ее инициализации.
  • Пользователь помещает эту библиотеку в каталог /tmp
  • Пользователь создает Oracle LIBRARY, указывая на /tmp с помощью оператора CREATE LIBRARY
  • Пользователь принуждает extproc к dlopen эту библиотеку
  • exproc будет выполнить вредоносный код с привилегиями OS oracle:dba

При использовании этого ограничения EXTPROC_DLLS:ONLY разработчики должны сотрудничать с DBAs, и только библиотеки из белого списка могут быть использованы и загружены.

Похожие вопросы:

Что такое вид в Oracle?

что такое d2k в oracle

Я читал статью о машинном обучении, и она содержит эксперимент Oracle для сравнения между его исследованием и другим исследованием? Но, кажется, не так ясно, что такое Oracle эксперимент?

В Mysql, если мы вставим, удалим или обновим данные, то с помощью mysql_affected_rows(), мы получим количество строк, затронутых &, которые мы можем использовать в PHP для хранения их в variable.

У нас есть два экземпляра Oracle на одном сервере (оба 11g), которые используют один и тот же прослушиватель. У меня возникли проблемы с подключением к extproc: TNSNAMES.ORA.

Я использую Oracle 11g. Я ищу хорошее объяснение Oracle сеансов. Я погуглил для этого, но, как ни странно, ни один из веб-сайтов не содержит никакого объяснения того, что такое сеансы оракулов. Мои.

Я новичок в мире Oracle MAF.Could кто-нибудь поможет мне описать, что такое Oracle MAF и ключевые понятия Oracle MAf? Это будет полезно для меня, чтобы понять

Я просто хочу знать, поддерживает ли MySql низкоуровневые функции базы данных, такие как xp_cmdshell и extproc. Я знаю, что xp_cmdshell не поддерживается для MySql из-за политики безопасности, но.

Не мог бы кто-нибудь объяснить, что такое Random Oracle? Я пытаюсь разобраться в тонкостях криптографии, когда только что наткнулся на термин Random Oracle. Слабое понимание этого термина говорит.

Для того, чтобы в Oracle 11gR2 из PL/SQL вызвать функцию внешней динамической библиотеки необходимо:

  • создать динамически подгружаемую библиотеку с необходимой функцией, это .so - shared object - в ОС Unix и .dll - dynamic link library - в ОС Windows,
  • поместить динамическую библиотеку в директорию на сервере, где работает экземпляр Oracle,
  • сконфигурировать процесс exptproc для того, чтобы он мог найти и загрузить динамическую библиотеку,
  • создать в БД Oracle объект LIBRARY, который присвоит имя полному пути к динамической библиотеке,
  • создать в БД Oracle PL/SQL процедуру или функцию - обертку, указав объект LIBRARY и спецификацию вызова функции динамической библиотеки.

Я проделаю перечисленные шаги и продемонстрирую вызов функций внешней динамической библиотеки из PL/SQL.

Под пользователем oracle в ОС Linux создам директорию /home/oracle/test и в ней - файл с исходным текстом программы на C:

Для функции hello предстоит сделать PL/SQL функцию-обертку, для функции write , не возвращающей значения, - PL/SQL процедуру-обертку.

Откомпилируем файл и построим динамическую библиотеку:

Подробнее о том, как создать динамическую библиотеку в Linux при помощи инструментария gcc, можно прочитать в статье Shared libraries with GCC on Linux.

Прежде чем пытаться вызывать функции библиотеки из PL/SQL, проверю их работоспособность с помощью программы на C. Для этого, создам заголовочный файл для библиотеки libhello.so и тестовую программку test.c .

Создам исполняемый файл test :

Установлю переменную LD_LIBRARY_PATH (для того, чтобы ОС нашла и подгрузила библиотеку libhello.so ) и выполню test :

Убедившись, что библиотека libhello.so работоспособна, перехожу к конфигурированию процесса extproc . Это процесс Oracle, который загружает внешние библиотеки при вызове функций этих библиотек из PL/SQL.

До версии Oracle 11gR2 для запуска процесса extproc он должен был быть явно сконфигурирован в файлах listener.ora и tnsnames.ora . Однако, начиная с версии Oracle 11gR2 процесс extproc не нуждается в явном конфигурировании, и изменять указанные файлы больше не требуется.

В файле extproc.ora (расположенном в директории $ORACLE_HOME/hs/admin в ОС Unix и в %ORACLE_HOME%\hs\admin в ОС Windows) определяются переменные окружения для процесса extproc . Приведу содержание этого файла с описанием переменной EXTPROC_DLLS и ее установкой для работы с библиотекой libhello.so :

Следующий шаг - создать объект LIBRARY в БД Oracle:

Осталось создать PL/SQL функцию-обертку для библиотечной функции hello и процедуру-обертку для библиотечной функции write . Нам понадобится передавать внешним функциям строковые параметры и получать строкоый результат от функции hello .

Создам PL/SQL функцию и процедуру для вызова внешних функций в пакете hello :

Здесь для функции hello не специфицированы типы данных параметра и возвращаемого значения - это значит, Oracle выполнит неявные преобразования к соответствующим типам данных по умолчанию. Типу данных PL/SQL VARCHAR2 соответствует по умолчанию тип спецификации STRING (а ему - тип C char* ). А для процедуры write тип данных параметра msg специфицирован явно - чтобы продемонстрировать, как это делается.

Вызову функцию hello и процедуру write :

Вернусь на сервер, в директорию /home/oracle/test и проверю содержимое файла hello.txt :

Итак, мы получили ожидаемый результат.

Ниже я приведу соответствия основных типов данных PL/SQL, типов данных для спецификации внешних процедур и типов данных С. Таблица подготовлена по данным Advanced Application Developer's Guide из официальной документации Oracle 11gR2:

PL/SQLТип данных спецификацииТип данных C
BINARY_INTEGER
BOOLEAN
PLS_INTEGER
[UNSIGNED] CHAR
[UNSIGNED] SHORT
[UNSIGNED] INT
[UNSIGNED] LONG
[unsigned] char [*]
[unsigned] short [*]
[unsigned] int [*]
[unsigned] long [*]
FLOAT
REAL
FLOAT float [*]
DOUBLE PRECISION DOUBLE double [*]
NUMBER OCINUMBER OCINumber *
CHAR
CHARACTER
LONG
NCHAR
NVARCHAR2
ROWID
VARCHAR
VARCHAR2
STRING
OCISTRING
char *
OCIString *
LONG RAW
RAW
RAW
OCIRAW
unsigned char *
OCIRaw *
BFILE
BLOB
CLOB
NCLOB
OCILOBLOCATOR OCILobLocator *
DATE OCIDATE OCIDate *
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
OCIDateTime OCIDateTime [*]
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH
OCIInterval OCIInterval [*]
composite object types: collections (varrays, nested tables) OCICOLL OCIColl * or OCIArray * or OCITable *

При передаче значений из PL/SQL во внешние C функции и обратно возникают, в частности, следующие вопросы:

  • как передать значение NULL (то есть, отсутствие значения)?
  • как передать ограничения на размер данных (например, результирующая строка не должна быть длинее 100 символов)?
  • как передать кодировку, в которой представлены строковые данные?

Разработчики Oracle позаботились дать ответы на эти вопросы с помощью параметров-свойств (properties), указываемых в части PARAMETERS спецификации вызова наравне с обычными параметрами. В частности, определены следующие свойства:

INDICATOR показывает, что другой параметр или возвращаемый результат имеет значение NULL . LENGTH содержит текущую длину другого IN или [IN] OUT параметра или возвращаемого значения. MAXLEN содержит максимально допустимую длину другуого [IN] OUT параметра или возвращаемого значения. CHARSETID содержит идентификатор набора символов передаваемой из PL/SQL строки (тот самый, что возвращает SQL функция NLS_CHARSET_ID ). CHARSETFORM содержит 1 для набора символов БД (database charset, используемый с типами данных CHAR, VARCHAR2, CLOB) и 2 для национального набора символов (national charset, используемый с типами данных NCHAR, NVARCHAR2, NCLOB).

Подробнее о спецификации вызова внешних процедур и о работе с параметрами-свойствами можно прочитать в Database Advanced Application Developer's Guide.

Читайте также: