2008年8月23日星期六

ORACLE XML DB 系列(5)

检索和操纵XML数据
顺利地将XML数据存入数据库中之后,我们就可以对XML数据进行增删改查操作了。ORACLE数据库中,可以通过SQL函数或者XQUERY来实现,由于大家对SQL比较熟悉,所以在这里,我主要介绍SQL函数的方法,而XQUERY,是W3C提出的查询语言,对XML支持的相当完善,因此个人觉得XQUERY也是以后XML检索的一个发展方向。
ORACLE提供了很多函数可以供我们操纵XML数据,主要介绍以下几个:
EXTRACT函数用于提取指定XPATH的值,可以提取枝节点也可以提取叶节点,返回值是XMLTYPE类型。第一个参数是存储XML数据的列,第二个参数是XPATH。
Eg:SELECT extract(XMLCOLUMN,'/metadata/resTitle')
FROM example1;
EXTRACTVALUE函数用于提取指定XPATH的值,当然只允许提取唯一的叶节点,返回值是改节点的数据类型,比如resTitle节点是字符型数据,EXTRACTVALUE函数就会以VARCHAR2类型返回当前节点的值,而Date节点是日期型数据,该函数就会以DATE类型返回当前节点的值。
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')
FROM xmltest
existsNode函数用于判断给定的条件是否满足,满足返回1,不满足则返回0.
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')

FROM xmltest where existsNode(xmlfiles,'/metadata[resTitle ="fff”]) =1;
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')

FROM xmltest where existsNode(xmlfiles,'/metadata/resTitle [contains(.,"fff”]) =1;
上条语句出现了CONTAIN函数,这个函数用于判定指定节点是否包含指定的值。

更新XML数据节点:
UPDATEXML函数:
UPDATE example1

SET XMLCOLUMN =updateXML(XMLCOLUMN,'/metadata/resTitle/text()','123456')

WHERE existsNode(XMLCOLUMN,'/metadata[resTitle="fff"]') = 1;

插入子节点操作:
insertChildXML函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder

SET OBJECT_VALUE =

insertChildXML(OBJECT_VALUE,

'/PurchaseOrder/LineItems',

'LineItem',

XMLType('

The Harder They Come


UnitPrice="22.95"

Quantity="1"/>

'))

WHERE existsNode(OBJECT_VALUE,

'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')

= 1;


insertXMLbefore函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder

SET OBJECT_VALUE =

insertXMLbefore(OBJECT_VALUE,

'/PurchaseOrder/LineItems/LineItem[1]',

XMLType('

Brazil


UnitPrice="69.95"

Quantity="2"/>

'))

WHERE existsNode(OBJECT_VALUE,

'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')

= 1;


APPENDCHILDXML函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder

SET OBJECT_VALUE =

appendChildXML(OBJECT_VALUE,

'/PurchaseOrder/Actions/Action[1]',

XMLType('2002-11-04'))

WHERE existsNode(OBJECT_VALUE,

'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')

= 1;


删除节点:
deleteXML函数,不能删除必选节点:
UPDATE purchaseorder

SET OBJECT_VALUE =

deleteXML(OBJECT_VALUE,

'/PurchaseOrder/LineItems/LineItem[@ItemNumber="222"]')

WHERE existsNode(OBJECT_VALUE,

'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')

= 1;

没有评论: