[转载]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(& ...
- 【转载】C#操作XML
这个网上一大把,对XML操作先转载,以后研究一下 C#读取XML时候如何获取最好的性能. Fash Li 的XML读取写的非常的清晰,这里直接转载了,多谢各位博友的无私分享,能让大家有更多的时间研究未 ...
- 【转】python XML 操作总结(创建、保存和删除,支持utf-8和gb2312)
原文地址:http://hi.baidu.com/tbjmnvbagkfgike/item/6743ab10af43bb24f6625cc5 最近写程序需要用到xml操作,看了看python.org上 ...
- ASP.NET控件GridView的使用& Xml操作注意事项
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6729478.html 文章主要内容 ...
- c# xml操作(二)
c# xml操作(二) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 上次,我们介绍了增加和删除xml的一些操作,这次我们将介绍如何更改和读取xml特定节点.我们依然以上次的xml ...
- c# xml操作(一)
c# xml操作(一) 此博文包含图片 (-- ::)转载▼ 标签: 杂谈 分类: c# 同样是增,删,改,查四种操作.现在我们就详细介绍一下增和删两种操作.看下面的一个xml示例: <?xml ...
- Open XML操作Excel导入数据
项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...
- 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操作一般用在数据量很大,性能优化的地方,当然我在平时做项目的时候也是没用 ...
随机推荐
- soap协议测试
soap就是http发送xml数据 1.soap协议提包含下列元素,红色标注为必须 2.soap消息基本结构 3.http+xml方式测试soap协议
- CDW数学小笔记
今天我们来做一道题目. 输入正整数\(n\)(\(\le 10^{15}\)),求\(x^2+y^2=n^2\)的整数解的个数. 也就是圆心为原点,半径为\(n\)的圆上整点的数量. 为了得到更普遍的 ...
- PHP全栈学习笔记25
<?php /* *@Author: 达叔小生 **/ header("content-type:image/png"); //设置页面编码 $num = $_GET['nu ...
- Python3数字
Python3数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着,如果改变数字数据类型的值,将重新分配内存空间. Python支持三种不同不同的数值类型: 整型(int):通常是被称为整型 ...
- Java 【打印俄文的英文字母】
俄文的的字符可以用 'A' 到 'Я '. public class main { public static void main(String args[]) { char S = 'А', C = ...
- linux中清理旧内核
执行update的时候会自动升级内核,开机启动的时候会好多内核选项.所以我们要清理不需要内核. 查看当前系统使用的内核版本 uname -a Linux localhost.localdomain 3 ...
- Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配. re模块中research(pattern,string[,flags]), ...
- (转)SmartPing:一个服务器Ping值监测工具
官网:https://docs.smartping.org/ 借鉴:https://www.moerats.com/archives/710/ 说明:之前博主发过一个雨落大神写的Ping值监测工具uP ...
- DCL:管理用户
1. 管理用户 (1) 查询用户 MySQL把用户的数据存放在 "mysql" 数据库的 "user" 表中. SELECT * FROM user; (2) ...
- Java网站视频资源加密
----------------------------------------------------------分享此文章,只为让版权能够得到更多的保护---------------------- ...