在 Oracle 中,ST_Geometry 和 ST_Raster 的 SQL 函数使用通过 Oracle 的外部过程代理(即 extproc)访问的共享库。要将 SQL 和 ST_Geometry 或 ST_Raster 配合使用或访问 GDB_ITEMS_VW 和 GDB_ITEMRELATIONSHIPS_VW 视图中的 ArcSDE XML 列,Oracle 必须能够访问这些库。因此,这些库必须存在于 Oracle 服务器上,并且必须通过 Oracle 的外部过程框架调用它们。
在 ArcGIS 中,不设置 Oracle 监听器也可以使用 ST_Geometry 和 ST_Raster。但是,您将不会拥有 ArcGIS 客户端的全部功能,也不会拥有 SQL 客户端的任何功能(如 SQL*Plus)。例如,如果未配置 Oracle 监听器,则无法对 ArcMap 的查询图层中的 ST_Geometry 列使用 SQL 函数、无法识别数据库视图中的要素、无法对包含 ST_Raster 列的表进行版本化,无法删除包括 ST_Raster 列的行,也无法从 SQL 客户端执行 SQL 函数。另外,如果您不配置 Oracle 监听器,则无法通过使用 ST_Geometry 类型作为要素服务的数据库发布数据。
Arcgis下该文件位置,取哪个都可以
Server下:
C:\Program Files\ArcGIS\Server\DatabaseSupport\Oracle
Desktop下:
C:\Program Files (x86)\ArcGIS\Desktop10.2\DatabaseSupport\Oracle
(10.4多了个libst_raster_ora.so,不知做啥的一起放过去)
将该文件放置到ORACLE_HOME/lib下,并且权限设为chmod 777或644都可以
#chown oracle:oinstall libst_shapelib.so
chmod 777 libst_shapelib.so
注意:通过FTP(默认是文本方式)上传so文件时,必须采用binary二进制方式,否则执行insert语句时会报一下错误:
(另外还要注意:将so文件放置到oracle用户的lib路径下无效,必须放置到负责启动监听的用户下的lib路径下。
2020年7月30日补充:这条可能要看情况,试过几次都是放在ORACLE_HOME/lib下才生效,可能不用放到监听用户下的)
进入ORACLE_HOME/hs/admin,打开extproc.ora
[oracle@redhat6 admin]$ pwd
/home/oracle/app/oracle/product/11.2.0/dbhome_1/hs/admin
[oracle@redhat6 admin]$ ls
extproc.ora initdg4odbc.ora listener.ora.sample tnsnames.ora.sample
ANY
When EXTPROC_DLLS=ANY, DLL checking is disabled.
Syntax: SET EXTPROC_DLLS=ANY
SET EXTPROC_DLLS=
可以看一下文件的相关说明,只需要修改一个地方
SET EXTPROC_DLLS=ANY即可
重启监听(可选操作,2020年7月30日:貌似最近几次不用重启,最近实验10.4版本)即可。(注意,这种方式只针对Oracle11g以上的版本)
1.Sde用户下查询
select * from user_libraries;
2.创建library --修改为具体路径
create or replace library ST_SHAPELIB as '/oracle2/product/11.2.0/dbhome_1/lib/libst_shapelib.so';
alter package sde.st_geometry_shapelib_pkg compile reuse settings;
select sde.st_astext(sde.st_transform(sde.st_point('point(1 1)', 4326), 4326))from dual;
这种语句不报错基本就可以了(好像有些环境不行,见附录2020年12月14日补充说明)
–其中4326为srid值,也可能为2,具体需要查询,查询待补充
特定插入语句测试
insert into p
(OBJECTID,
ID,
NAME,
CITY_ID,
COUNTY_ID,
TYPECODE,
IS_RESERVE,
STATUS,
STYLE,
SCALE,
SHAPE)
values
(297185,
1054046,
'测试',
1,
0,
9503,
null,
3,
null,
null,
SDE.ST_POINTFROMTEXT('POINT(100 20)', 4326));
今晚遇到的情况是,负载的数据库用grid启监听,/u01/app/11.2.0/grid/lib/libst_shapelib.so配置不行,改成/u01/app/11.2.0/oracle/lib/libst_shapelib.so 就可以
其中也参考以下修改了listener.ora,没改tnsname,可能无关
listener.ora修改后部分
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))) # line added by Agent
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLExtProc)
(ORACLE_HOME = /u01/app/11.2.0/grid)
(PROGRAM = extproc)
(ENVS = “EXTPROC_DLLS=ANY”)
)
)
https://blog.csdn.net/a_dev/article/details/77481876
每次搞SDE总作妖,上上周又搞了一次10.2的sde,extproc怎么改怎么配不顶事,好在测试服务器,oracle可以随意重启,好了,放弃求索。转到最初的配置sde方法,修改tnsnames和listener,重启监听,搞定。所以能费点儿事,省点儿心也不用一味死折腾extproc,能解决问题的就是好方法。
10.4下内容基本一致,只是多了个libst_raster_ora.so,放置到了安装目录下,没有配置extproc.ora,也没重启监听,就生效了
参考:http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#/na/002n00000091000000/
https://blog.csdn.net/haichao062/article/details/39294909
https://blog.csdn.net/a_dev/article/details/77481876
1.10.6下的也只有一个libst_shapelib.so
2.今天测试数据库用的10.7的desktop,创建的sde库,执行测试ST_Geometry函数是否正常这一步,查询语句报错,插入 语句没问题,先记下来,没影响的话就这样不用管了