xmltype 类型数据中指定属性求和语法

蓝海 2016-04-11 09:21:26
数据示例如下:
假定有表“project”,字段为 id 字符型, content 为 sys.xmltype类型,现 id 为 "101" 对应的记录中 content 内容如下
<Sheets>
<Page SheetIndex="1">
<Detail id="1" num1="100"/>
<Detail id="2" num1="120"/>
<Detail id="3" num1="110"/>
<Detail id="4" num1="120"/>
</Page>
</Sheets>

问:如何通过 SQL 或利用存储过程、自定义函数等,给所有 Detail 节点中的 num1 求和?

注:现本人通过如下语句

select t.content.extract('//Sheets/Page/@num1').getNumberVal() as val from project t;

只能查回一条记录,并且返回的 num1 字段对应值为 100120110120 即将所有假定记录进行字符拼接结果。

求高人指点。
...全文
135 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝海 2016-04-11
  • 打赏
  • 举报
回复
哦,落了个 Detail 节点: 故将

select t.content.extract('//Sheets/Page/@num1').getNumberVal() as val from project t;

改为

select t.content.extract('//Sheets/Page/Detail/@num1').getNumberVal() as val from project t;
蓝海 2016-04-11
  • 打赏
  • 举报
回复
建表及插入数据的SQL如下:

-- Create table
create table project
(
  id      varchar2(50),
  content sys.xmltype
);

insert into project (id, content) values ('101', sys.xmltype.createXML('<Sheets><Page SheetIndex="1"><Detail id="1" num1="100"/><Detail id="2" num1="120"/><Detail id="3" num1="110"/><Detail id="4" num1="120"/></Page></Sheets>'));

COMMIT;
make_sail 2016-04-11
  • 打赏
  • 举报
回复
分两步实现 第一步:先求出<Page></Page>中有几个<Detail />
--实现此步可参考
select length('<Detail s1="1"/><Detail s1="2"/><Detail s1="3"/>') -
       length(replace('<Detail s1="1"/><Detail s1="2"/><Detail s1="3"/>',
                      '<Detail',
                      'Detail')) iCount
  from dual;
第二步:

select t.content.extract('//Sheets/Page/Detail[1]/@num1').getNumberVal() as val from project t;
select t.content.extract('//Sheets/Page/Detail[2]/@num1').getNumberVal() as val from project t;
--逐条查询出结果值,直到第一步求出的记录条数。再进行合计。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧