Вызовы функции ST_Geometry
Функции ST_Geometry в Oracle и PostgreSQL реализованы в языке структурированных запросов (SQL). Это язык уровня базы данных. В Oracle это процедурный язык структурированных запросов (PL/SQL). В PostgreSQL – это PL/pgSQL.
Когда вы обращаетесь к полям ST_Geometry с помощью SQL-функций, вы непосредственно обращаетесь к базе данных. Следовательно, база данных должна получить доступ к функциям ST_Geometry. В Oracle база данных также запускает процесс extproc.
PostgreSQL
Библиотека st_geometry должна находиться в директории установки PostgreSQL, чтобы позволить PostgreSQL получить доступ к функциям ST_Geometry. Вам необходимо скопировать файл st_geometry.dll (Windows) в папку lib в директории установки PostgreSQL. На сервере Linux: скопируйте файл st_geometry.so (Linux) в директорию /usr/lib/pgsql на сервере PostgreSQL. Оба этих файла находятся в папке DatabaseSupport для установленного клиентского приложения ArcGIS.
Oracle
Функции реализованы на языке PL/SQL, который вызывает функции из внешних файлов совместно используемых библиотек, написанных на языке программирования C. Функции вызываются из PL/SQL по псевдониму, который представляет собой соответствие между названием библиотеки — в случае с ST_Geometry в Oracle это ST_SHAPELIB — и именем файла библиотеки. (Для получения более подробных сведений о команде Oracle CREATE LIBRARY см. документацию). Когда в первый раз вызывается функция пространственного типа, для которой требуется ST_SHAPELIB, база данных запрашивает listener запустить процесс extproc для сессии SQL. Процессу extproc сообщается расположение ST_SHAPELIB, имя функции, которую необходимо вызвать, и ее параметры. Процесс extproc загружает ST_SHAPELIB и вызывает функцию. Когда внешняя функция завершает работу, extproc возвращает результаты и продолжает работать, ожидая новых вызовов функции во время текущей сессии. Процесс extproc завершается по завершении сессии SQL.
Для того чтобы данный механизм работал, необходима следующая конфигурация:
- Базе данных необходимо знать расположение файла с библиотекой ST_SHAPELIB, чтобы отправить эту информацию listener и далее – процессу extproc.
- Если file_spec для ST_SHAPELIB в таблице user_libraries не правильно указывает на физическое расположение ST_SHAPELIB на сервере, операторы и функции ST_Geometry не будут работать. Поэтому необходимо с помощью команды CREATE LIBRARY обновить определение библиотеки в пользовательских библиотеках Oracle, чтобы в них указывался правильный путь к файлу, содержащему ST_SHAPELIB.
Примечание:
Изменение определения пути библиотеки делает некорректными содержимое пакетов, которые связаны с ней; поэтому содержимое пакетов некоторых встроенных процедур ArcSDE должно быть перекомпилировано с использованием Oracle.
- База данных должна знать о сервисе, обрабатывающем запросы и передающем их процессу extproc. Эта настройка сохраняется в файле tnsnames.ora.
- Процессу extproc должно быть разрешено загружать файл, содержащий ST_SHAPELIB. Это делается путем определения переменной среды EXTPROC_DLLS в файле listener.ora (Oracle 10g) или в файле extproc.ora (Oracle 11g).
- Пользователь extproc (обычно запускаемый из-под пользователя, который владеет ORACLE_HOME) должен иметь права на чтение для того расположения, где находятся файлы библиотеки, и права доступа на выполнение этих файлов.
- Если вы изменили файл listener.ora, необходимо перезапустить процесс listener.