一提起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來檢視相關的資料,是以就想到了這個。
-------------------------------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
------------------------------------------------------------------------------------------------------