ST_Geometry 函数调用
Oracle 和 PostgreSQL 中的 ST_Geometry 函数采用结构化查询语言 (SQL) 实现。这是一门数据库级语言。在 Oracle 中,即为“面向过程的结构化查询语言 (PL/SQL)”。在 PostgreSQL 中,即为 PL/pgSQL。
如果使用 SQL 函数访问 ST_Geometry 列,则直接访问数据库。因此,数据库必须能够访问 ST_Geometry 函数。在 Oracle 中,数据库也生成 extproc 进程。
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 的文件中。
注:
更改库路径的定义将使引用库的包正文失效,因此应使用 Oracle 重新编译某些 ArcSDE 存储过程的包正文。
- 数据库必须了解处理 extproc 请求的服务。在文件 tnsnames.ora 中配置。
- 必须允许 extproc 加载包含 ST_SHAPELIB 的文件。通过定义 listener.ora 文件 (Oracle 10g) 或 extproc.ora 文件 (Oracle 11g) 中的环境变量 EXTPROC_DLLS 实现此目的。
- extproc(通常以拥有 ORACLE_HOME 的用户身份运行)必须对库文件的位置具有读取权限,并且对文件具有执行权限。
- 如果更改 listener.ora 文件,必须重新启动侦听器。