天天看點

使用SQL語句來通路ArcGIS版本表

一提起SQL操作ArcGIS的表,大部分使用者都應該用過SQL操作ST_Geometry,也就是SQL直接對Base表進行相關的操作,但是有使用者會問,我是否可以使用SQL操作已經注冊過的要素類,而且這個要素類進行過編輯操作,我是否可以使用SQL來查詢出來,而且這個結果和ArcGIS Desktop查詢的結果一樣,其實很簡單,看如下例子:

比如我有一個要素類IDCOUNTY_1,已經注冊版本了,而且我也進行相關的增、删、改等編輯操作

首先看一下IDCOUNTY_1要素類的描述

C:\Users\Administrator>sqlplus test/[email protected]

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 [email protected] –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來檢視相關的資料,是以就想到了這個。

-------------------------------------------------------------------------------------------------------

版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!

------------------------------------------------------------------------------------------------------