关于元数据入库的总结
一,关于什么是空间数据的元数据?
元数据的英文名称是“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() 。