顺利地将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('
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('
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('
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;
没有评论:
发表评论