一直都感觉ArcGis连接oracle数据库,配置st_geometry是个坑。(下文中的oracle都是11g)
首先就是官方文档里的说明,“配置 Oracle extproc 以使用 SQL 访问地理数据库”中给出了配置方法:
在 Windows 服务器上,您可添加与以下类似的行:
EXTPROC_DLLS=ONLY:C:\\mylibraries\\st_shapelib.dll
EXTPROC_DLLS=ONLY:C:\\mylibraries\\libst_raster_ora.dll
如果您使用两个库,可将它们放在一行上:
EXTPROC_DLLS=ONLY:C:\\mylibraries\\st_shapelib.dll;C:\\mylibraries\\libst_raster_ora.dll
在这些示例中,库放置在名为 mylibraries 的文件夹中,此文件夹在 Oracle 服务器上创建以存储库。
在 Linux 或 UNIX 服务器上:
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_shapelib.so
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_raster_ora.so
如果您使用两个库,可将它们放在一行上:
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_shapelib.so:/user/esrilibs/libst_raster_ora.so但是根据这个方法配置我印象中没成功过,而网上的很多文章也给了不少误导,以至于我每一次部署环境都提心吊胆,惴惴不安。
下面给出我自己总结的方法:(测试语句 select sde.ST_AsText(SDE.ST_Geometry('POINT (10 10)', 0)) from dual;)
0.每此修改配置后一定要重启监听器,至于是否重启oracle服务,不重启有时候行,有时候不行,还是建议重启吧;
1.windows 7环境,oracle 11gxe版本,一体式部署:修改user_libraries的路径:create or replace library ST_SHAPELIB as 'c:\oracle路径\BIN\st_shapelib.dll'; 然而我并没有配置EXTPROC_DLLS或listener.ora就神奇地可以用了。
如果路径本来就正确,修改user_libraries不是必须的,但是还是建议修改到oracle_home的bin下面去。
2.windows 虚拟机,oracle 11g,一体式部署:首先修改user_libraries,同上。其次
SET EXTPROC_DLLS=ANY
这是和文档不同的地方,设置完毕后也可以使用了。
3.linux oracle 11g+windows arcgis:首先要去esri官网下载so包,版本一定要正确,这个so包互不兼容的。然后同上一样配置,完成后也可以执行语句了。
踩过的几个坑:
1.linux下如果按照官方的文档配置,并修改user_libraries,在pl/sql中可以正常执行insert语句,但是在jdbc下依然报错。
2.配置完毕后务必重启监听程序。
3.出现过修改user_libraries一直不成功的情况,一定要检查user_libraries是否有正确的路径和是否valid。
4.在我的几次测试中,listener的配置不是必须的,获取是因为该服务是动态注册。但失败的几次也都配置了listener。对于oracle的这些组件我只知道oracle由listener分配给客户端一个server process,而extproc(External Procedures)的作用是调用外部库,根据网上的文章,lintener会调用extproc,所以如果一直没有成功,还是配置一下listener试试运气吧。