Oracle 和 PostgreSQL 中的 ST_Geometry 函数采用结构化查询语言 (SQL) 实现。这是一门数据库级语言。在 Oracle 中,即为“面向过程的结构化查询语言 (PL/SQL)”。在 PostgreSQL 中,即为 PL/pgSQL。
在 Oracle 或 PostgreSQL 数据库中使用 SQL 函数访问 ST_Geometry 列时,将直接访问数据库;因此,数据库必须能够访问 ST_Geometry 函数。在 Oracle 中,数据库也生成 extproc 进程。
在 SQLite 中,ST_Geometry 函数在 ST_Geometry 库中使用 C 语言实现。必须访问 ST_Geometry 库才能使用 ST_Geometry 函数。
PostgreSQL
St_geometry 库必须存储在 PostgreSQL 安装目录中,以便 PostgreSQL 能够访问 ST_Geometry 函数。您必须将 st_geometry.dll (Windows) 文件复制到 PostgreSQL 安装目录的 lib 文件夹中。对于 Linux 服务器,将 st_geometry.so (Linux) 文件复制到 PostgreSQL 服务器上的 /usr/lib/pgsql 目录中。在 ArcGIS 客户端安装的 DatabaseSupport 文件夹中可以找到这两个文件。
Oracle
函数在 PL/SQL 中实现,并且在用 C 编程语言编写的外部共享库文件中调用函数。函数通过 PL/SQL 使用将库名称映射到库文件名称的别名进行调用,对于 Oracle 中的 ST_Geometry,即使用库 ST_SHAPELIB 的名称映射到库文件的名称。(有关详细信息,请参阅 Oracle CREATE LIBRARY 命令的相关文档。)首次调用空间类型函数需要 ST_SHAPELIB,数据库请求侦听器为 SQL 会话生成 extproc 进程。将为 extproc 给定 ST_SHAPELIB 的位置、要调用函数的名称及其参数。extproc 会加载 ST_SHAPELIB 并调用函数。在此会话期间,当外部函数完成调用时,extproc 会返回结果并保持活动状态,等待其他函数调用。extproc 进程会在 SQL 会话断开连接时终止。
要执行此操作,需要以下配置:
- 数据库需要知道包含 ST_SHAPELIB 的文件的位置,这样才能将位置信息传递到侦听器进程,最后传递到 extproc。
- 如果在 user_libraries 表中,ST_SHAPELIB 的 file_spec 与服务器上 ST_SHAPELIB 的物理文件位置不匹配,ST_Geometry 运算符和函数将不起作用。因此,您必须在 Oracle 用户库中更新库定义,从而在使用 CREATE LIBRARY 命令时,将正确的库路径包含到具有 ST_SHAPELIB 的文件中。
- 数据库必须了解处理 extproc 请求的服务。在文件 tnsnames.ora 中配置。
- 必须允许 extproc 加载包含 ST_SHAPELIB 的文件。通过定义 listener.ora 文件 (Oracle 10g) 或 extproc.ora 文件 (Oracle 11g) 中的环境变量 EXTPROC_DLLS 实现此目的。
- extproc(通常以拥有 ORACLE_HOME 的用户身份运行)必须对库文件的位置具有读取权限,并且对文件具有执行权限。
- 如果更改 listener.ora 文件,必须重新启动侦听器。
SQLite
必须指定 ST_Geometry 库的位置并进行加载,以便 SQLite 客户端能够访问 SQL 函数。可以在客户端的 PATH (Windows) 或 LIBPATH (Linux) 系统环境变量中设置库的位置,然后加载库;或者可以在加载 ST_Geometry 库时指定路径。有关说明,请参阅加载 SQLite ST_Geometry 库。