/*=====================生成\修改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操作的更多相关文章

  1. oracle xml操作

      /*=====================生成\修改xml========================= */ --xmlelement多个标签层级 SELECT XMLELEMENT(& ...

  2. 【转载】C#操作XML

    这个网上一大把,对XML操作先转载,以后研究一下 C#读取XML时候如何获取最好的性能. Fash Li 的XML读取写的非常的清晰,这里直接转载了,多谢各位博友的无私分享,能让大家有更多的时间研究未 ...

  3. 【转】python XML 操作总结(创建、保存和删除,支持utf-8和gb2312)

    原文地址:http://hi.baidu.com/tbjmnvbagkfgike/item/6743ab10af43bb24f6625cc5 最近写程序需要用到xml操作,看了看python.org上 ...

  4. ASP.NET控件GridView的使用& Xml操作注意事项

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢!   原文链接:http://www.cnblogs.com/zishi/p/6729478.html 文章主要内容 ...

  5. c# xml操作(二)

    c# xml操作(二) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 上次,我们介绍了增加和删除xml的一些操作,这次我们将介绍如何更改和读取xml特定节点.我们依然以上次的xml ...

  6. c# xml操作(一)

    c# xml操作(一) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 同样是增,删,改,查四种操作.现在我们就详细介绍一下增和删两种操作.看下面的一个xml示例: <?xml ...

  7. Open XML操作Excel导入数据

    项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...

  8. LINQ系列:LINQ to XML操作

    LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...

  9. T-Sql(五)xml操作

    t-sql中的xml操作在我们平时做项目的过程中用的很少,因为我们处理的数据量很少,除非一些用到xml的地方,t-sql中xml操作一般用在数据量很大,性能优化的地方,当然我在平时做项目的时候也是没用 ...

随机推荐

  1. java类加载和对象初始化

    对象初始化过程:  1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  3.其次,初 ...

  2. spark源码之SparkContext

    SparkContext可以说是Spark应用的发动机引擎,Spark Drive的初始化围绕这SparkContext的初始化. SparkContext总览 sparkcontxt的主要组成部分 ...

  3. js 删除节点

    亲身经历,寻得此法,告知大家=============== 在javascript操作dom树的时候可能会经常遇到增加,删除节点的事情,比如一个输入框后一个增加按钮,一个删除按钮,点击增加就增加 个输 ...

  4. Python数据结构学习

    列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. 以下是 Python 中列表的方法: 方法 描述 list.append(x ...

  5. Vue实战041:获取当前客户端IP地址详解(内网和外网)

    前言 我们经常会有需求,希望能获取的到当前用户的IP地址,而IP又分为公网ip(也称外网)和私网IP(也称内网IP),IP地址是IP协议提供的一种统一的地址格式,每台设备都设定了一个唯一的IP地址”, ...

  6. opencv VS C++ 配置

    包含目录 $(OPENCV)\include\ $(OPENCV)\include\opencv\ $(OPENCV)\include\opencv2\   即: D:\opencv\opencv\b ...

  7. java中 什么是反射?

    JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射 ...

  8. centos7.2下查看的java版本号

    1,centos7.2下查看的java版本号 java -version

  9. DELPHI解析JSON格式化的日期

    DELPHI解析JSON格式化的日期 json返回的日期是 /Date(1560355200000)/ 这样的格式. 这个1560355200000,是指1970年以后的秒数. DELPHI如何解析这 ...

  10. MySQL 8.0: From SQL Tables to JSON Documents (and back again)

    MySQL 8.0: From SQL Tables to JSON Documents (and back again) | MySQL Server Bloghttps://mysqlserver ...