oracle xml操作
/*=====================生成\修改xml========================= */
--xmlelement多个标签层级
SELECT XMLELEMENT("TEST",
XMLELEMENT("AA",
XMLELEMENT("BB", 'XXX'),
XMLELEMENT("CC", 'XXX')))
FROM DUAL;
SELECT XMLELEMENT("test")
FROM DUAL
----XMLATTRIBUTES 多个属性
SELECT XMLELEMENT("TEST",
'',
XMLELEMENT("AA",
XMLATTRIBUTES('' "test_attribute"),
XMLELEMENT("BB",
XMLATTRIBUTES('z' "attr",NULL "XO"),
'XXX'),
XMLELEMENT("CC", 'XXX')),
'qwe')
FROM DUAL; --xmlforest ,如果要定义标签节点属性值则不能用
SELECT XMLELEMENT("TEST",XMLFOREST(NULL "WW",'' "XX",'' "xx")) FROM dual;
--关于空值是否会生成生应的标签
--1、xmlelement 空值或null都会有结束的标签不会出现</> ,xmlattributes 空值或null对应的键名不会出现
SELECT XMLELEMENT("test", XMLELEMENT("test1", XMLATTRIBUTES(1 "test1_attribute"),NULL),
XMLELEMENT("test2", XMLATTRIBUTES('' "test2_attribute"),''),
XMLELEMENT("test3", XMLATTRIBUTES(NULL "test3_attribute")),'haha')
FROM dual;
--2.xmlforest null整个标签名不会出现,单引号会出现
SELECT XMLELEMENT("test", XMLFOREST(NULL "test1",'' test3)) FROM dual;
--xmlagg 生成xml片段
WITH t AS (SELECT '' a,'A' b FROM dual)-- UNION ALL SELECT '2','A' b FROM dual UNION ALL SELECT '3','B' b FROM dual)
SELECT XMLELEMENT("KK",XMLAGG(XMLELEMENT("TEST",a))) FROM t GROUP BY b;
SELECT XMLELEMENT("TT",(SELECT XMLAGG(XMLELEMENT("TEST",a) ORDER BY a) FROM t)) FROM dual;
--排序
SELECT XMLELEMENT("KK",XMLAGG(XMLELEMENT("TEST",a) ORDER BY a DESC)) FROM t GROUP BY b;
--可生成无效的xml,xml只能有一个根结节点
SELECT XMLAGG(XMLELEMENT("TEST",a)) FROM t
--以下会报错
SELECT XMLTYPE.CreateXML('<dummy>X</dummy><dummy>y</dummy>') FROM dual; --聚合,可替代 sys_path_connect_by,listagg
WITH Q AS
(SELECT 1 KEY, 'A' X
FROM DUAL
UNION ALL
SELECT 2 KEY, 'B' X
FROM DUAL
UNION ALL
SELECT 3 KEY, 'A' X
FROM DUAL
UNION ALL
SELECT 4 KEY, 'A' X
FROM DUAL)
--SELECT X,
--RTRIM(
--XMLAGG (XMLELEMENT(e, key||',') ORDER BY key)
--) AS concatval
--FROM q
--GROUP BY X;
SELECT X,
RTRIM(XMLAGG(XMLELEMENT(E, KEY || ',') ORDER BY KEY)
.EXTRACT('//text()'),
',') AS CONCATVAL
FROM Q
GROUP BY X;
-- xmlconcat 拼接xml元素
SELECT XMLCONCAT(XMLELEMENT("x", Xmlattributes('' "xmlns"),XMLELEMENT("y", ''),XMLELEMENT("y", '')),
XMLELEMENT("x",Xmlattributes('xyz' "xmlns"), XMLELEMENT("y", ''),XMLELEMENT("y", '')),
XMLELEMENT("x",Xmlattributes('xyz' "xmlns"), XMLELEMENT("y", ''),XMLELEMENT("y", ''))) FROM dual; --UPDATEXML 修改xml标准内容和attribute
--UPDATEXML(xmltype_instance, xpath_expression, value_expr, namespace_expr)
--xml:
<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY>1000</SALARY>
</DEPT>
--可以同时修改多个标签内容
SELECT UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY>1000</SALARY>
</DEPT>'),
'/DEPT/SALARY/text()', --通过XPath表达式,指定要修改的标签元素
'',
'/DEPT/EMPID/text()',
'AA')
FROM DUAL;
--如果标签元素没有值,则更新该标签的数据时也会无效,这是Oracle bug 2962474
SELECT UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY></SALARY>
</DEPT>'),
'/DEPT/SALARY/text()',
'')
FROM DUAL;
--可通过下面语句解决,重写该标签,找不到对应要修改的标签不会报错
SELECT UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY />
</DEPT>'),
'/DEPT/SALARY',
XMLTYPE('<SALARY>1100</SALARY>'))
FROM DUAL;
--修改属性,找不到对应要修改的属性不会报错
SELECT
UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY taxable="yes">3</SALARY>
</DEPT>'),
'/DEPT/SALARY/@taxable', 'no','/DEPT/SALARY/text()','')
FROM dual;
--更新为null
--1.
SELECT
UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY>1000</SALARY>
</DEPT>'),
'/DEPT/SALARY/text()', NULL)
FROM dual;
--2、
SELECT
UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY taxable="yes">1000</SALARY>
</DEPT>'),
'/DEPT/SALARY', null)
FROM dual;
--更新父节点,为null则所有字节点都消失,剩下父节点
SELECT
UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY taxable="yes">1000</SALARY>
</DEPT>'),
'/DEPT', null)
FROM dual;
--去除父节点下所有字节点的值(采用通配符)
--1.
SELECT
UPDATEXML(XMLTYPE('<DEPT>
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY>1000</SALARY>
</DEPT>'),
'/DEPT//*', NULL)
FROM dual;
--2.如果父节点有属性,一定要指出,或则更新不到数据
SELECT
UPDATEXML(XMLTYPE('<DEPT xmlns="xyz">
<EMPID>1</EMPID>
<EMPNAME>Martin Chadderton</EMPNAME>
<SALARY>1000</SALARY>
</DEPT>'),
'/DEPT/EMPID/text()', NULL,
'/DEPT/EMPNAME/text()', NULL,
'/DEPT/SALARY/text()', NULL,'xmlns="xyz"')
FROM dual; --高级应用,指定的namespace_expr 下,更新z='10'的数值
DECLARE
X XMLTYPE := XMLTYPE('<x xmlns="xyz"><y>10</y><z>20</z><z>10</z></x>');
BEGIN
SELECT UPDATEXML(X, '/x/z[. = "10"]/text()','','xmlns="xyz"')
INTO X
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(X.GETCLOBVAL);
END; --UPDATEXML可修改非标准xml(根节点多个)
DECLARE
X XMLTYPE := XMLTYPE('<x xmlns="xyz"><y>10</y><y>20</y></x>');
BEGIN
SELECT UPDATEXML(XMLCONCAT(XMLELEMENT("x", Xmlattributes('' "xmlns"),XMLELEMENT("y", ''),XMLELEMENT("y", '')),
XMLELEMENT("x",Xmlattributes('xyz' "xmlns"), XMLELEMENT("y", ''),XMLELEMENT("y", '')),
XMLELEMENT("x",Xmlattributes('xyz' "xmlns"), XMLELEMENT("y", ''),XMLELEMENT("y", ''))), '/x/y[. = "10"]/text()','AA','xmlns="xyz"')
INTO X
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(X.GETCLOBVAL);
END; --删除某个节点
--1.通用做法 10.1之前
DECLARE
x XMLTYPE := XMLTYPE('<a><b><c>10X</c></b><b><c>20</c></b><b><c>10Y</c></b></a>');
BEGIN
SELECT UPDATEXML(x, '/a/b[starts-with(c,10)]', NULL)
INTO x
FROM dual;
dbms_output.put_line(REPLACE(x.getstringval,'<b/>',''));
END;
--2.10.2及以上(DELETEXML)
--DELETEXML(xmltype_instance, xpath_expression, namespace_expr)
DECLARE
x XMLTYPE := XMLTYPE('<a xmlns="xyz"><b><c>10X</c></b><b><c>20</c></b><b><c>10Y</c></b></a>');
BEGIN
SELECT DELETEXML(x, '/a/b[starts-with(c,10)]','xmlns="xyz"')
INTO x
FROM dual;
dbms_output.put_line(x.getstringval);
END;
--如果有父节点有属性,一定要指出,或则删不了
DECLARE
x XMLTYPE := XMLTYPE('<a xmlns="xyz"><b><c>10X</c></b><b xmlns="xyz"><c>110X</c></b></a>');
BEGIN
SELECT DELETEXML(x, '/a/b','xmlns="xyz"')
INTO x
FROM dual;
dbms_output.put_line(x.getclobval);
END;
--XMLROOT 增加xml开头信息,这个目前不支持编码的指定
SELECT XMLROOT(XMLELEMENT("x", dummy), VERSION '1.0' , STANDALONE YES) FROM dual;
--XMLCOMMENT 增加xml注释 EXTRACT('/')在sqlplus显示的时候格式会好看一些
SELECT XMLELEMENT("x",
XMLELEMENT("x1", dummy),
XMLCOMMENT('Test Comment'),
XMLELEMENT("x2", dummy)
).EXTRACT('/')
FROM dual; --XMLCDATA 10g之前没有这个函数, CDATA节是用来告诉XML解析器将一切作为数据。如果你有一个要求发送信息,例如,有很多XML“非法”字符,如&、<和>,
--但不能包含 ]]>
SELECT UPDATEXML(XMLELEMENT("parent", XMLCDATA('Here is a string with a < and a >')),'/parent//text()','')
FROM dual; SELECT XMLELEMENT("parent", XMLCDATA('Here is a![[ string with a < and a')) FROM dual;
--如果值为空或null不会生成CDATA
SELECT XMLELEMENT("x", XMLCDATA('')) FROM dual;
/*=====================通过xml获取数据========================= */
--xmltable
--XMLTABLE(<xpath/query> PASSING <xmltype document>
-- COLUMNS <column alias> <datatype> PATH <xpath/query>, {<column alias> <datatype> PATH <xpath/query>...})
select *
from tt,xmltable('/ipmp/head' passing xmltype(tt.clb_content)
columns reference varchar2(99) path 'reference',
busiCode varchar2(99) path 'busiCode')
WHERE clb_content LIKE '%ipmp%'; --如果字段类型长度比值还短,会进行截取
select *
from xmltable('/a/b' passing xmltype('<a><b>1120</b><b>21230</b></a>')
columns b varchar2(2) path '.');
--不用xmltable的实现方式
SELECT
EXTRACTVALUE(VALUE(t), '/a/b') b,
EXTRACTVALUE(VALUE(t), '/a/c') a
FROM
TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<a><b>10</b><c>20</c></a>'), '/a'))) t;
--指定返回类型
SELECT *
FROM XMLTABLE('/a/b'
PASSING XMLTYPE('<a><b>10</b></a>')
COLUMNS b_as_varchar2 VARCHAR2(2) PATH '../b',
b_as_xmltype XMLTYPE PATH '/',
b_as VARCHAR2(3) PATH '.'); --获取属性
select *
from xmltable('/a' passing xmltype('<a><b battr="1">10</b><c>20</c></a>')
columns b varchar2(2) path 'b',
battr varchar2(1) path 'b/@battr',
c varchar2(2) path 'c');
--获取指定命名空间的相关标签
select t.b, t.c
from XMLTABLE(XMLNAMESPACES('namespace2' AS "ns1"),
'/t/ns1:a'
PASSING XMLTYPE('<t><a xmlns="namespace1"><b>aa</b><c>bb</c></a><a xmlns="namespace2"><b>10</b><c>20</c></a></t>')
COLUMNS b VARCHAR2(2) PATH 'ns1:b',
c VARCHAR2(2) PATH 'ns1:c') t; --获取指定不同命名空间的相关标签,如果xml里面有指定,在获取的时候也要指定,否则取不到数据
select t.b, t.c
from XMLTABLE(XMLNAMESPACES('namespace1' AS "ns1", 'namespace2' AS "ns2"),
'/ns1:a'
PASSING XMLTYPE('<a xmlns="namespace1"><b xmlns="namespace2">10</b><c>20</c></a>')
COLUMNS b VARCHAR2(2) PATH 'ns2:b',
c VARCHAR2(2) PATH 'ns1:c') t;--如果节点下有相关的标签,则可以通过下面去获取各自的值
--12c
SELECT c.ref, c.val
FROM XMLTABLE('/a/b/c'
PASSING XMLTYPE('<a><b><ref>1</ref><c>10</c><c>20</c><c>30</c></b></a>')
RETURNING SEQUENCE BY REF
COLUMNS ref INTEGER PATH '../ref',
val INTEGER PATH '/') p
--12c以下
SELECT p.ref, c.val
FROM XMLTABLE('/a/b'
PASSING XMLTYPE('<a><b><ref>1</ref><cc>1</cc><c>10</c><c>20</c><c>30</c></b></a>')
COLUMNS ref INTEGER PATH 'ref',
cxml XMLTYPE PATH 'c') p,
XMLTABLE('/c'
PASSING p.cxml
COLUMNS val INTEGER PATH '/') c ---XMLEXISTS 11g以上才有 XMLEXISTS(<xpath/xquery> PASSING <xmltype document>) 判断xml是否存在节点
WITH x AS (
SELECT XMLTYPE('<a><b></b></a>') a FROM dual
)
SELECT CASE WHEN XMLEXISTS('/a/c' PASSING x.a) THEN 'TRUE' ELSE 'FALSE' END
FROM x; --带命名空间
WITH x AS (
SELECT XMLTYPE('<a xmlns="abc"><b xmlns="q"></b></a>') a FROM dual
)
SELECT CASE WHEN XMLEXISTS('declare namespace ns1="abc";declare namespace ns2="q"; (::) /ns1:a/ns2:b' PASSING x.a) THEN 'TRUE' ELSE 'FALSE' END
FROM x; --例子
WITH t as (select xmltype('<CODEVALUE>AA</CODEVALUE>') xmlvar from dual )
select xmlvar
from t
where XMLEXISTS ('/CODEVALUE[.="AA"]' PASSING xmlvar); WITH t as (select xmltype('
<ROWSET>
<ROW>
<CODETYPE>ClaimCause</CODETYPE>
<CODESEQNO>1</CODESEQNO>
<CODEVALUE>A</CODEVALUE>
</ROW>
<ROW>
<CODETYPE>Claim</CODETYPE>
<CODESEQNO>1</CODESEQNO>
<CODEVALUE>AA</CODEVALUE>
</ROW>
<ROW>
<VALID>Y</VALID>
<CODETYPE>Remarks</CODETYPE>
<CODESEQNO>1</CODESEQNO>
</ROW>
</ROWSET>
') xmlvar from dual )
select xmlvar
from t
where XMLEXISTS ('/ROWSET/ROW/CODEVALUE[.="AA" ]' PASSING xmlvar)
AND XMLEXISTS ('/ROWSET/ROW/CODETYPE[.="ClaimCause"]' PASSING xmlvar)
AND
XMLEXISTS ('/ROWSET/ROW[CODEVALUE="AA" and CODETYPE="Claim"]' PASSING xmlvar); WITH t as (select xmltype('
<ROWSET>
<ROW>
<CODETYPE>ClaimCause</CODETYPE>
<CODESEQNO>1</CODESEQNO>
<CODEVALUE>A</CODEVALUE>
</ROW>
<ROW>
<CODETYPE>Claim</CODETYPE>
<CODESEQNO>1</CODESEQNO>
<CODEVALUE>AA</CODEVALUE>
</ROW>
<ROW>
<VALID>Y</VALID>
<CODETYPE>Remarks</CODETYPE>
<CODESEQNO>1</CODESEQNO>
</ROW>
</ROWSET>
') xmlvar from dual )
select xmlvar , CODETYPE, CODEVALUE
from t
,xmltable ('for $i in /ROWSET/ROW
return $i'
passing xmlvar
columns CODETYPE varchar2(100) path 'CODETYPE'
,CODEVALUE varchar2(100) path 'CODEVALUE'
) x
where x.codevalue = 'AA'
and x.codetype = 'ClaimCause'
;
oracle xml操作的更多相关文章
- [转载]oracle xml操作
/*=====================生成\修改xml========================= */ --xmlelement多个标签层级 SELECT XMLELEMENT(&qu ...
- LINQ系列:LINQ to XML操作
LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...
- T-Sql(五)xml操作
t-sql中的xml操作在我们平时做项目的过程中用的很少,因为我们处理的数据量很少,除非一些用到xml的地方,t-sql中xml操作一般用在数据量很大,性能优化的地方,当然我在平时做项目的时候也是没用 ...
- XML格式示例 与 XML操作(读取)类封装
header('Content-Type: text/xml'); <?xml version="1.0" encoding="utf-8" standa ...
- 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...
- 简单的XML操作类
/// <summary> /// XmlHelper 的摘要说明. /// xml操作类 /// </summary> public class XmlHelper { pr ...
- .net学习笔记---xml操作及读写
一.XML文件操作中与.Net中对应的类 微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现. 以下给出XML文档的组成部分对应.NET中的类: XML文档组成部分 对应 ...
- C#常用操作类库三(XML操作类)
/// <summary> /// XmlHelper 的摘要说明. /// xml操作类 /// </summary> public class XmlHelper { pr ...
- [转]Oracle 树操作(select…start with…connect by…prior)
转自http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html Oracle 树操作(select-start with-conne ...
随机推荐
- leetcode个人题解——#22 Generate Parentheses
思路: 递归解决,如果左括号个数小于右括号或者左括号数小于总括号对数,则生成一个左括号,如果左括号数大于右括号,生成一个右括号. class Solution { public: vector< ...
- Fluent Python: Classmethod vs Staticmethod
Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...
- SGU 438 The Glorious Karlutka River =)(最大流)
Description A group of Mtourists are walking along the Karlutka river. They want to cross the river, ...
- nodejs笔记--与Redis的交互篇(六)
原文地址:http://www.cnblogs.com/zhongweiv/p/node_redis.html 安装前准备 win64: Install python: http://www.pyth ...
- Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
. : 关机, 如果将Linux默认运行等级设置为0, 系统将无法启动; -- : 多用户模式, 允许使用网络文件系统, 一般不使用图形界面登陆就是这种模式; -- : 多用户图形界面模式, 该模式下 ...
- TCP系列10—连接管理—9、syncookie、fastopen与backlog
这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...
- HDU 2068 Choose the best route
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...
- Chromium之工程类别
虽然有700多个project,其实有很多是不成声二进制执行文件的,他们主要是调用cygwin的环境,执行一些python的脚本. 具体这个.py文件做了哪些共工作,还要再研究,目前看到有打包一些.p ...
- vue-cli2使用cdn方式引入cytoscape
1. index.html头部引用 <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.2.19/cytos ...
- js获取某周、某月、下月、某季度的开始日期、结束日期及判断日期第几周
//格式化日期:yyyy-MM-dd function formatDate(date) { var myyear = date.getFullYear(); var mymonth = da ...