参考地址:
http://desktop.arcgis.com/zh-cn/arcmap/10.5/manage-data/using-sql-with-gdbs/configure-oracle-extproc.htm
配置 Oracle extproc 以使用 SQL 访问地理数据库
加粗字体为操作步骤
说明
文档中的操作都是基于oracle 12c的基础上,因为项目需要没用过低版本或者其他版本的,可能会有些差别要自己再查些别的资料
*使用SDE账户进行操作
在Oracle 中,ST_Geometry 和
ST_Raster 的 SQL 函数使用通过 Oracle 的外部过程代理(即 extproc)访问的共享库。Oracle 必须能够访问物理库文件,您才能执行以下任意操作:
·
从 SQL 客户端执行 ST_Geometry 或 ST_Raster SQL 函数。
·
访问 GDB_ITEMS_VW 和
GDB_ITEMRELATIONSHIPS_VW 地理数据库系统视图中的 ArcSDE XML 列。
·
在对 ST_Geometry 列执行 SQL 函数的 ArcMap 或 ArcGIS Pro 中定义查询图层。
·
从 ArcMap 或 ArcGIS Pro 识别数据库视图中的要素。
·
将包含 ST_Raster 列的表注册为版本。
·
使用 ArcGIS 客户端删除包括 ST_Raster 列的行。
您需要配置 Oracle 外部过程框架调用库才能执行这些任务。
在大多数情况下,您会安装 ST_Raster 类型以便通过 SQL 对其进行访问。因此,配置 Oracle extproc 以使用 ST_Raster 的说明将包含在
ST_Raster 安装主题中。本主题重点介绍配置 ST_Geometry 的 extproc 的过程。
提示:
ST_Geometry 和
ST_Raster 库可随 ArcGIS Server 与
ArcMap 客户端一起安装,也可从 My Esri 进行下载。如果您已在 Oracle 计算机上安装了 ArcGIS Server 或 ArcMap,则可将您的 extproc.ora 文件配置为指向以下位置之一,并且您可以跳过以下列出的两个准备步骤。
步骤1
将下面的文件夹windows64拷贝至数据库服务器目录下,重命名为mylibraries
·
Windows 上的 ArcGIS Server:\ArcGIS\Server\DatabaseSupport\Oracle\Windows64
·
Linux 上的 Arc~~ GIS Server:/arcgis/server/DatabaseSupport/oracle/linux64
·
ArcMap:\ArcGIS\Desktop\DatabaseSupport\Oracle\Windows64
如果指向 ArcMap 或 ArcGIS Server 位置,则在安装新版 ArcMap 或 ArcGIS Server 时将自动获得更新的库。如果您将这些库放置在其他位置,则需要手动对其更新才能获得新版 ArcGIS 库中所包含的修复和改进程序。
步骤2
安装对应arcgis版本的Microsoft Visual C++ Redistributable Package (x64)
配置
Oracle extproc 之前,请完成以下步骤:
- 如果您的 Oracle 实例无法访问上述 ArcGIS Server 或 ArcMap 安装位置,请下载这些库或将其从 ArcGIS 客户端计算机复制到 Oracle 计算机的目录中。确保复制适合 Oracle 操作系统的库。
注:
在Windows 服务器上部署 ST_Geometry 库时,需要使用对应版本的 Microsoft Visual C++ Redistributable Package (x64)。如果 Oracle 服务器上没有 Microsoft Visual C++ SP1 Redistributable Package (x64),可从 Microsoft 网站下载后进行安装。
- 创建空间类型、创建企业级地理数据库和启用企业级地理数据库地理处理工具可为 ST_SHAPELIB 库设置默认路径。以 sde 用户身份从 SQL 客户端连接至 Oracle 实例,
然后执行以下 SQL 以查看当前为 ST_SHAPELIB 库设置的路径:
SELECT file_spec FROM user_libraries WHERE library_name=‘ST_SHAPELIB’;
如果此操作返回的路径与 ST_Geometry 库文件位置不匹配,则需要在配置 extproc 后重新创建该库。
将Oracle extproc.ora 配置为指向 ST_Geometry 库文件位置。
**步骤3
1 、修改在ORACLE_HOME\hs\admin 下的extproc.ora
2、extproc.ora中增加 SET EXTPROC_DLLS=ANY
3 、修改listener.ora 如下部分
**SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\oracle11g\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = “EXTPROC_DLLS=ANY”)
)
)
-
在 Oracle 服务器上修**改extproc.ora 文件的备份副本。
-
打开 extproc.ora 文件并将其改为指向 st_shapelib.dll (Windows) 或 libst_shapelib.so(Linux 或 UNIX)库的位置。
在本例中,未在 Oracle Windows 服务器上安装 ArcGIS 客户端,因此已将 st_shapelib.dll 复制到 Oracle 计算机中名为 mylibraries 的目录下。已将以下行添加到 extrproc.ora 中以指向该目录下的 ST_Geometry 库:
SET EXTPROC_DLLS=ONLY:C:\mylibraries\st_shapelib.dll
如果您正在使用 ST_Geometry 和 ST_Raster 两个库,可将二者的条目放在同一行上:
SET EXTPROC_DLLS=ONLY:C:\mylibraries\st_shapelib.dll;C:\mylibraries\libst_raster_ora.dll
本示例中,已将以下行添加到 Linux 或 UNIX 服务器上,以指向用户的 esrilibs 目录中的 ST_Geometry 库,此目录在 Oracle 服务器上创建以存储库:
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_shapelib.so
如果您正在使用 ST_Geometry 和 ST_Raster 两个库,可将二者的条目放在同一行上:
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_shapelib.so:/user/esrilibs/libst_raster_ora.so
15324999.12607
- 保存并关闭 extproc.ora 文件。
步骤4
登录sde库,上述查看ST_SHAPELIB文件位置与实际不符,需要重建
执行如下语句
CREATE or REPLACE LIBRARY ST_SHAPELIB AS ‘C:\mylibraries\st_shapelib.dll’;
ALTER PACKAGE sde.st_geometry_shapelib_pkg COMPILE
REUSE SETTINGS;
- 如果您将 ST_Geometry 库文件的默认位置改为其他位置或未对其设置任何位置,请在 Oracle 数据库中创建或重新创建 ST_SHAPELIB 库。
在本例中,将 ST_SHAPELIB 库设置为 Oracle Windows 服务器上用于放置 st_shapelib.dll 文件的 mylibraries 目录。
CREATE or REPLACE LIBRARYST_SHAPELIBAS ‘C:\mylibraries\st_shapelib.dll’;
- 如果您已重新创建该库,请重新编译
sde.st_geometry_shapelib_pkg 包。
ALTER PACKAGE sde.st_geometry_shapelib_pkg COMPILE REUSE SETTINGS;
- 需要访问库(包括 web 服务)的所有客户端必须重新连接到数据库。
需要重启数据库监听,可能需要重启数据库服务
步骤5
验证:select sde.st_astext(shape) from DXGX_L
错误解决
是一直提示如下错误:
ORA-28595:
Extproc 代理: DLL 路径无效
ORA-06512:
在 “SDE.ST_GEOMETRY_SHAPELIB_PKG”, line 70
ORA-06512:
在 “SDE.ST_GEOMETRY_OPERATORS”, line 68
百度了一番也没找到方法,后来还是通过 google 查找到了线索,通过调试一番终于解决,在此给大家说明一下解决的思路。
我本机的 oracle11g 安装目录为 E:\oracle11g。
1、打开 E:\oracle11g\product\11.2.0\dbhome_1\NETWORK\ADMIN 目录下的 listener.ora
文件,
发现之前写的是 :
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\oracle11g\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = “EXTPROC_DLLS=ONLY:E:\oracle11g\product\11.2.0\dbhome_1\bin\oraclr11.dll”)
)
)
把它修改为:
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\oracle11g\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = “EXTPROC_DLLS=ANY”)
)
)
2、打开 E:\oracle11g\product\11.2.0\dbhome_1\hs\admin 目录下的 extproc.ora文件,
最后一行原来写的 是 SET EXTPROC_DLLS= , 把他修改为 SET
EXTPROC_DLLS=ANY
3、重启 OracleOraDb11g_home1TNSListener服务和
OracleServiceORCL服务。
4、重启 PL/SQL ,再次运行 select
sde.st_astext(shape) from DLWG_SQ, 这次终于不再提示错误了,正常查询到结果。
5、若还是报相同错误:检查电脑安装的c++版本是否和arcgis版本对应,如不对应,需重新下载安装。