微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我试过

select regexp_count(diagram,'userTask id=',1,'c') as "User Tasks",regexp_count(diagram,'task id=','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

解决方法

我认为将 XML 存储为 XMLTYPE 而不是 CLOB 会更好。然后您可以创建一个虚拟列,甚至可以在其上创建索引。像这样:

CREATE TABLE PROCESS_TABLE (
    DIAGRAM XMLTYPE,TASK_COUNT      INTEGER GENERATED ALWAYS AS (
        TO_NUMBER(CAST(XMLQUERY('count(/definitions/process/task)' PASSING BY VALUE "DIAGRAM" RETURNING CONTENT) AS VARCHAR2(100)))
    ) VIRTUAL,USER_TASK_COUNT INTEGER  GENERATED ALWAYS AS (
        TO_NUMBER(CAST(XMLQUERY('count(/definitions/process/userTask)' PASSING BY VALUE "DIAGRAM" RETURNING CONTENT) AS VARCHAR2(100)))
    ) VIRTUAL
)
XMLTYPE DIAGRAM STORE AS SECUREFILE BINARY XML; 

CREATE INDEX IND_TASK_COUNT ON process_table (TASK_COUNT);
,

有几种方法可以做到这一点。一种是使用 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<>fiddle 使用一个简单的 XML CLOB 抛出您看到的错误,以及这三种方法(包括将 XMLQuery 结果转换为数字)。

我也很想知道其他人的想法。


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

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

如果处理的行有一个空 diagram,这将出错;但您可以通过添加 where diagram is not null 来排除这些。

db<>fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?