如何从 XML clob 列中选择计数?

塞缪尔

我正在尝试选择 XML(CLOB) 列中的标签计数。

我试过

select regexp_count(diagram, 'userTask id=', 1, 'c') as "User Tasks",
       regexp_count(diagram, 'task id=', 1, 'c') as "Task"
from process_table

它有效,但是,我需要比使用 regexp_count 更快地获得输出。

我试过:

select count(xt.task),
count(xt.userTask)
from process_table process
cross join xmltable(
            xmlnamespaces(default 'http://www.omg.org/spec/BPMN/20100524/MODEL'),
            '//definitions/process' passing xmltype(process.diagram) 
            columns
            task varchar2(20) path 'task',
            userTask varchar2(60) path 'userTask'
            ) xt

但是,我收到一个错误 ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence

亚历克斯·普尔

有几种方法可以做到这一点。一种是使用 XMLTable 查找任一子节点,获取节点名称,并计算每个子节点出现的次数:

select
  count(case when xt.name = 'userTask' then name end) as userTasks,
  count(case when xt.name = 'task' then name end) as tasks
from process_table process
cross join xmltable(
  xmlnamespaces(default 'http://www.omg.org/spec/BPMN/20100524/MODEL'),
  '//definitions/process/(userTask|task)' passing xmltype(process.diagram) 
  columns
    name varchar2(20) path 'name(.)'
) xt

或者您可以使用 FLWOR 表达式一次获取两种子节点类型的计数:

select userTasks, tasks
from process_table process
cross join xmltable(
  xmlnamespaces(default 'http://www.omg.org/spec/BPMN/20100524/MODEL'),
  'let $u := count(//definitions/process/userTask)
   let $s := count(//definitions/process/task)
   return <x><u>{$u}</u><s>{$s}</s></x>'
  passing xmltype(process.diagram) 
  columns
    userTasks number path 'u',
    tasks number path 's'
) xt

但我不确定这会比第一种选择更快。

另一种选择是对每个节点使用单独的 XMLQuery XPath 计数来检查:

select
  xmlquery('declare default element namespace "http://www.omg.org/spec/BPMN/20100524/MODEL";
      count(//definitions/process/userTask)'
    passing xmltype(diagram)
    returning content) as userTasks,
  xmlquery('declare default element namespace "http://www.omg.org/spec/BPMN/20100524/MODEL";
      count(//definitions/process/task)'
    passing xmltype(diagram)
    returning content) as tasks
from process_table

db<> 摆弄一个简单的 XML CLOB,它会抛出您看到的错误,以及这三种方法(包括将 XMLQuery 结果转换为数字)。

我也有兴趣看看其他人想出了什么。


XPath 计数返回 ORA-06502:PL/SQL:超过 10 行时的数值或值错误。当我添加 where 子句时效果很好

当我添加 id = some_number 或显示 10 行时,它会起作用。

如果处理的行有一个 null diagram这将出错但是您可以通过添加where diagram is not null.

数据库<>小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章