關於元數據入庫的總結
一,關於什麼是空間數據的元數據?
元數據的英文名稱是“Metadata"它是“關於數據的數據”在地理空間信息中用於描述地理數據集的內容、質量、表示方式、空間參考、管理方式以及數據集的其他特徵,它是實現地理空間信息共享的核心標準之一。
二,元數據入庫,到底入庫的元數據是什麼呢?存儲到哪個數據庫呢?
1,元數據是數據的數據,對數據的描述和說明,元數據也可以對數據進行管理和控制。元數據產生伴隨着地理數據入庫,使用,更新,停止使用整個生命週期。通過元數據一方面可以很方便的給用戶的使用提供方便,另一方面也可以管理數據的使用。
2,要入庫的是用來描述地理數據的文件,我們採用XML來記錄記錄空間數據的元數據,主要XML有很多優點:1)XML文檔的內容和結構完全分離; 2)互操作性強;3)規範統一;4)支持多種編碼;5)可擴展性。
3,我們把元數據存儲到Oracle數據庫中,選擇Oracle的數據庫的原因:
Oracle中可以提供了建立XmlType類型的表,可以直接存儲XML,很方便的進行數據的導入,查詢,更新,刪除。
三,怎麼XML元數據文件在Oracle中的存儲,查詢,更新,刪除。
這一部分是總結的重要內容,也是實現此功能的核心所在。經過了一段時間在完成此功能的摸索,現總結如下:
1,當XML文件在4K以內的話,需要使用的sql如下:
1)創建元數據表SQL:
CREATE TABLE METADATATABLE (ID NUMBER , LAYERNAME CHAR2(100) , METADATA SYS.XMLTYPE) 。
2)插入一條記錄SQL:
INSERT INTO METADATATABLE (ID , LAYERNAME , METADATA) VALUES ( 1 , ‘圖層名稱‘ , SYS.XMLTYPE.CREATEXML(‘元數據內容’)。
注意到要通過 SYS.XMLTYPE.CREATEXML(‘元數據內容’)來將單引號內的字符串轉換爲xmltype,才能存儲到xmltype類型字段的表中。
3)查詢一條記錄SQL:
SELECT I. METADATA.EXTRACT(‘//Metadata’).getStringVal() FROM METADATATABLE I WHER I.METADATA.EXTRACT(‘//mdFileID’).getStringVal()= ‘查詢值’;
4) 更新一條記錄SQL:
UPDATE METADATETABLE SET METADATA = SYS.CREATEXML(‘元數據值’) WHERE LAYERNAME = ‘圖層名’ ;
5) 刪除一條記錄SQL:
DELETE FROM METADATETABLE WHERE LAYERNAME = ‘圖層名’ ;
2, 元數據文件超過4K的時候,數據的插入,查詢,更新,會有不同。
1) 插入一條記錄SQL:
首先要先建立一個帶有CLOB類型的臨時表:
CREATE TABLE METADATETABLE_TEMP (ID NUMBER, LAYERNAME varchar2(200), METADATE clob)
然後利用參數的方式插入一條記錄:
insert into METADATETABLE_TEMP (ID,LayerName,MetaDate) values ( 1, '圖層名稱', :pMetadate)
OracleParameter pOracleParameter = new OracleParameter(":pMetadate", OracleType.Clob);
pOracleParameter.Value = “元數據字符串內容”;
2) 查詢一條記錄SQL
SELECT t.MetaDate.getclobval() FROM METADATETABLE t WHERE t.MetaDate.extract('//Metadata/mdFileID/text()').getStringVal() = ‘查詢的圖層名稱’
注意:通過t.MetaDate.getclobval() 這句將XMLTYPE 轉換爲了Clob類型,才能取出元數據內容,小於4k可以通過,METADATA.EXTRACT(‘//Metadata’).getStringVal() 取出元數據內容。
3)更新一條元數據
也是要採用參數的形式來更新元數據
首先,向臨時表插入元數據:
INSERT INTO METADATETABLE_TEMP (ID,LayerName,MetaDate) values ( 1, '圖層名稱', :pMetadate)
OracleParameter pOracleParameter = new OracleParameter(":pMetadate", OracleType.Clob);
pOracleParameter.Value = newValue;
然後,從臨時表中獲取數據來更新元數據表,由於取出來的CLOB類型,需要通過sys.xmlType.createXML() 轉換爲xmltype類型的。
update METADATETABLE set METADATE= (sys.xmlType.createXML((SELECT t.MetaDate FROM METADATETABLE_TEMP t WHERE t.LayerName= '圖層名稱'))) WHERE LayerName='圖層名稱'
總結:在寫sql語句操作數據的時候,要注意Oracle數據庫中表的不同字段類型之間的相互轉換。sys.xmlType.createXML() 和 t.MetaDate.getclobval() 。