Функции ST_Geometry в Oracle и PostgreSQL реализованы в языке структурированных запросов (SQL). Это язык уровня базы данных. В Oracle это процедурный язык структурированных запросов (PL/SQL). В PostgreSQL – это PL/pgSQL.
При осуществлении доступа к столбцам ST_Geometry в базе данных Oracle либо PostgreSQL с использованием функций SQL вы обращаетесь к базе данных напрямую, поэтому в базе данных должен быть доступ к функциям ST_Geometry. В Oracle база данных также запускает процесс extproc.
В SQLite функции ST_Geometry реализованы в C в библиотеке ST_Geometry. Вы должны обращаться к библиотеке ST_Geometry, чтобы использовать функции ST_Geometry.
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.
- База данных должна знать о сервисе, обрабатывающем запросы и передающем их процессу extproc. Эта настройка сохраняется в файле tnsnames.ora.
- Процессу extproc должно быть разрешено загружать файл, содержащий ST_SHAPELIB. Это делается путем определения переменной среды EXTPROC_DLLS в файле listener.ora (Oracle 10g) или в файле extproc.ora (Oracle 11g).
- Пользователь extproc (обычно запускаемый из-под пользователя, который владеет ORACLE_HOME) должен иметь права на чтение для того расположения, где находятся файлы библиотеки, и права доступа на выполнение этих файлов.
- Если вы изменили файл listener.ora, необходимо перезапустить процесс listener.
SQLite
Необходимо указать расположение и загрузить библиотеку ST_Geometry, чтобы SQLite-клиент мог получить доступ к функциям SQL. Вы можете указать местоположение библиотеки в клиентских системных переменных PATH (Windows) или LIBPATH (Linux) при загрузке библиотеки либо ввести путь при загрузке библиотеки ST_Geometry. Для получения инструкций см. раздел Загрузка библиотеки SQLite ST_Geometry.