一提起SQL操作ArcGIS的表,大部分用户都应该用过SQL操作ST_Geometry,也就是SQL直接对Base表进行相关的操作,但是有用户会问,我是否可以使用SQL操作已经注册过的要素类,而且这个要素类进行过编辑操作,我是否可以使用SQL来查询出来,而且这个结果和ArcGIS Desktop查询的结果一样,其实很简单,看如下例子:
比如我有一个要素类IDCOUNTY_1,已经注册版本了,而且我也进行相关的增、删、改等编辑操作
首先看一下IDCOUNTY_1要素类的描述
C:\Users\Administrator>sqlplus test/test@orcl SQL*Plus: Release 11.2.0.1.0 Production on 星期二 10月 9 11:14:45 2012 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> desc IDCOUNTY_1; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OBJECTID NOT NULL NUMBER(38) AREA NUMBER(18,6) PERIMETER NUMBER(18,6) IDCOUNTY_ NUMBER(11) IDCOUNTY_I NUMBER(11) CHANGE NUMBER(4,1) CO_NAME NVARCHAR2(11) GLOBALID NOT NULL CHAR(38) SHAPE SDE.ST_GEOMETRY已经将要素类注册了版本了,查询一下相关的注册ID
SQL> select registration_id from sde.table_registry where table_name='IDCOUNTY_1'; REGISTRATION_ID --------------- 140然后执行如下SQL语句即可
SELECT b.OBJECTID,b.AREA,b.PERIMETER,b.IDCOUNTY_,b.IDCOUNTY_I,b.CHANGE,b.CO_NAME,b.GLOBALID,b.SHAPE,0 SDE_STATE_ID FROM TEST.IDCOUNTY_1 b,(SELECT SDE_DELETES_ROW_ID,SDE_STATE_ID FROM TEST.D140 WHERE SDE_STATE_ID = 0 AND SDE.version_util.in_current_lineage (DELETED_AT) > 0) d WHERE b.OBJECTID = d.SDE_DELETES_ROW_ID(+) AND d.SDE_STATE_ID IS NULL AND SDE.version_util.get_lineage_list > 0 UNION ALL SELECT a.OBJECTID,a.AREA,a.PERIMETER,a.IDCOUNTY_,a.IDCOUNTY_I,a.CHANGE,a.CO_NAME,a.GLOBALID,a.SHAPE,a.SDE_STATE_ID FROM TEST.A140 a,(SELECT SDE_DELETES_ROW_ID,SDE_STATE_ID FROM TEST.D140 WHERE SDE.version_util.in_current_lineage (DELETED_AT) > 0) d WHERE a.OBJECTID = d.SDE_DELETES_ROW_ID(+) AND a.SDE_STATE_ID = d.SDE_STATE_ID(+) AND SDE.version_util.in_current_lineage (a.SDE_STATE_ID) > 0 AND d.SDE_STATE_ID IS NULL大家可以看看,因为这个牵涉到相关的A表、D表、State表、State_lineages表等,而且也包括目标要素类的字段,所以大家可以进行相关的修改,而且大家注意一下,以上SQL语句并不是一个纯粹的SQL,也就是说使用了比如SDE.version_util.in_current_lineage()等,大家可能觉得,这个SQL语句这么复杂,怎么写的啊,其实很简单,如果大家知道SDE有多版本视图的话,这个就不是那么麻烦了。
什么是多版本视图呢?
多版本化视图将数据库视图、存储过序、触发器和函数整合在一起,用以通过结构化查询语言 (SQL) 访问地理数据库表中指定版本的数据。
注意:不应将多版本化视图用于访问或修改复杂要素(例如,参与几何网络、拓扑、terrain、地籍结构、网络数据集或关系的要素,或具有特定地理数据库行为的要素)。
怎么创建多版本视图呢?
sdetable –o create_mv_view –T parcels_mv –t parcels -i sde:oracle11g –u bjorn@myora –p a.secret注意:在使用 sdetable –o create_mv_view 命令时,不要像在使用 sdetable –o create_view 或结构化查询语言创建标准或空间视图时那样选择列或定义 WHERE 子句。
tip:如果还对刚才的巨型SQL语句感兴趣的话,创建完这个多版本视图,大家可以在数据库里面的View项获得视图对象,查查相关的SQL语句就是本尊了。
使用多版本视图的步骤?
1:创建多版本化视图。
2:创建用于执行编辑的版本。
3:设置多版本化视图以使用新版本。
4:通过执行适合数据库的 edit_version 过程或函数启动编辑会话。
5:使用 SQL 在多版本化视图上执行编辑。
6:将编辑内容提交到数据库或回滚编辑内容。
7:通过执行适合数据库的 edit_version 过程或函数停止编辑会话。
8:通过 ArcGIS 协调并提交编辑。
9:使用 ArcGIS 将所有更改提交到父版本后,可删除多版本化视图上为进行编辑而创建的版本。
相关的操作教程
使用多版本化视图读取 Oracle 中已版本化的数据
在 Oracle 中使用多版本化视图和 SQL 编辑版本化数据
2011Esri开发者大会也做过类似的讲座
SQL操作Goedatabase
使用多版本视图的注意
刚好有一个用户咨询一个问题,他们中心库是Oracle,各个子节点是使用的SQL Server Express的Personal ArcSDE,相关的数据是使用了同步复制的One Way的子到父,SQL Express进行编辑数据,但是用户希望使用SQL来查看相关的数据,所以就想到了这个。
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------