ArcSDE10.1和10在安装配置上有了些变化,在配置ST_Geometry上总体而言原理是一样的,只是方式步骤上稍有变化,这里以SDE10.1 for Oracle11g R2 64位在windows7上为例来进行配置。
ArcGIS Desktop10.1安装完成后,会将DBMS配置ST_Geometry需要的dll都放在D:\Program Files (x86)\ArcGIS\Desktop10.1\DatabaseSupport\Oracle\下面,比如windows环境可以将里面的st_shapelib.dll拷贝到Oracle服务器端作为外部调用的dll。或者安装了ArcSDE,可以使用D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll。
在以前我们配置ST_Geometry的时候,需要在监听中配置extproc以调用外部过程,但在11g的tnsnames.ora文件中已经没有了EXTPROC_CONNECTION_DATA服务名,而是用ORACLR_CONNECTION_DATA代替了,而这个ORACLR_CONNECTION_DATA是不能用于配置ST_Geometry的,因此我们需要手动创建,添加:
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
在listner.ora文件里SID_LIST_LISTENER项下添加额外的SID_DESC,添加后如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\rockylx\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\rockylx\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\app\rockylx\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS="EXTPROC_DLLS=ONLY:D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll")
)
)
重启监听;
Sde用户进入sqlplus,执行SDE.ST_ASTEXT函数以验证ST_Geometry配置成功:
select AREA_ID,NAME,sde.st_astext(shape) as location from sde.hnsite;
在安装完sde后,会自动将C:\Progra~2\ArcGIS\Desktop10.1\DatabaseSupport\Oracle\Windows64\st_shapelib.dll动态库写入Oracle的libraries包:
如果在配置监听的过程中,修改了st_shapelib.dll的路径,需要重新编译这个包,以确保包的实际路径和设置匹配:
create or replace library ST_SHAPELIB
as 'D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll';
alter package sde.st_geometry_shapelib_pkg compile reuse settings;
针对Oracle11g,如果是动态监听,没有listener.ora文件,可以直接修改<ORACLE_HOME>\hs\admin extproc.ora文件来添加外部过程调用。
SET EXTPROC_DLLS=ONLY:C:\\Progra~2\\ArcGIS\\Desktop10.1\\DatabaseSupport\\Oracle\\Windows64\\st_shapelib.dll
或
SET EXTPROC_DLLS=ANY
配置完成后可以通过sde用户执行如下sql语句验证:
select AREA_ID,NAME,sde.st_astext(shape) as location from sde.hnsite;
常常遇到的问题:
1、在执行ST_Geometry函数的时候报错ORA-28575: unable to open RPC connection to external procedure agent
这个问题基本上都是监听配置有问题导致的,盯着Listener.ora文件想办法:
首先在监听启动后确保PLSExtProc这个调用外部进程的服务是正常的
LISTENER_GISDB01 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = zggisdb01-vip)(PORT = 1521)(IP = FIRST))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.96.30.66)(PORT = 1521)(IP = FIRST))
)
)
SID_LIST_LISTENER_GISDB01 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/db)
(PROGRAM = extproc)
(ENVS="EXTPROC_DLLS=/oracle/esrilib/libst_shapelib.so")
)
)
注意:如果没有采用默认的监听名字,如LISTENER_GISDB01,那么监听的实例描述一定要一致,即SID_LIST_监听名,否则PLSExtProc无法正常启动。
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))中的KEY和tnsnames.ora中的Key要一致;
Listener中的SID_NAME和tnsnames中的CONNECT_DATA下的SID_NAME要一致。
2、上述问题都解决后,如果还出现ORA-28595: Extproc agent : Invalid DLL Path类似的错误
那就要仔细检查动态链接库了,windows下是st_shapelib.dll,linux下是libst_shapelib.so,确保包的路径是正确的。
在Linux环境下有时候包的依赖不完整,也会导致问题,通过运行ldd libst_shapelib.so,查看该包的依赖包是否完整。