使用SQL语句来访问ArcGIS版本表

106 篇文章 0 订阅
99 篇文章 0 订阅

一提起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


使用多版本视图的注意

  • 创建多版本视图前必须先注册版本
  • 添加记录的时候不需要自己确定ID
  • 不要使用SQL来更新已有记录的ID
  • 为每一个编辑用户创建自己的子版本
  • 不要使用SQL操作Default版本
  • ArcGIS 9.3 SP2   ArcGIS10 SP2
  • 编辑开始前记得开始编辑
  • Edit action = 1(直接执行SQL出错)
  • 编辑结束后记得结束编辑
  • Edit action = 2(ArcMap切换不过去)

为什么会想到多版本视图

刚好有一个用户咨询一个问题,他们中心库是Oracle,各个子节点是使用的SQL Server Express的Personal ArcSDE,相关的数据是使用了同步复制的One Way的子到父,SQL Express进行编辑数据,但是用户希望使用SQL来查看相关的数据,所以就想到了这个。


-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值