sql - 如何使用 SQL 选择部分 CLOB 列
问题描述
我正在尝试从包含 XML 的 CLOB 列中获取部分数据。
我需要这个,因为我想根据这些数据创建一个报告。
表结构:
图表(ID 号,XML clob);
XML 示例:
<bpmn:task id="Task_3" name="Identify Application">
<bpmn:documentation id="Task_3_Documentation">lorem ipsum 1</bpmn:documentation>
<bpmn:incoming>SequenceFlow_4</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>
<bpmn:ioSpecification>
<bpmn:dataInput />
<bpmn:dataOutput />
<bpmn:inputSet>
<bpmn:dataInputRefs>DataObject</bpmn:dataInputRefs>
</bpmn:inputSet>
<bpmn:outputSet>
<bpmn:dataOutputRefs>DataObject_2</bpmn:dataOutputRefs>
</bpmn:outputSet>
</bpmn:ioSpecification>
<bpmn:property id="Property_2" name="__targetRefPlaceholder" />
<bpmn:property id="Property_0nnkfoz" name="__targetRef_placeholder" />
<bpmn:dataInputAssociation id="DataAssociation_4-input">
<bpmn:sourceRef>DataObject</bpmn:sourceRef>
<bpmn:targetRef>Property_2</bpmn:targetRef>
</bpmn:dataInputAssociation>
<bpmn:dataInputAssociation id="DataInputAssociation_0ur4zio">
<bpmn:sourceRef>DataObjectReference_0qo1qcm</bpmn:sourceRef>
<bpmn:targetRef>Property_0nnkfoz</bpmn:targetRef>
</bpmn:dataInputAssociation>
<bpmn:dataOutputAssociation id="DataAssociation_3-output">
<bpmn:targetRef>DataObject_2</bpmn:targetRef>
</bpmn:dataOutputAssociation>
<bpmn:dataOutputAssociation id="DataOutputAssociation_1rae1k7">
<bpmn:targetRef>DataObjectReference_0v1uvlu</bpmn:targetRef>
</bpmn:dataOutputAssociation>
</bpmn:task>
--- some XML here
<bpmn:task id="Task_2" name="Define Schedule">
<bpmn:documentation id="Task_2_Documentation">lorem ipsum 2</bpmn:documentation>
<bpmn:incoming>SequenceFlow</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>
<bpmn:ioSpecification>
<bpmn:dataOutput />
<bpmn:inputSet />
<bpmn:outputSet>
<bpmn:dataOutputRefs>DataObject_4</bpmn:dataOutputRefs>
</bpmn:outputSet>
</bpmn:ioSpecification>
<bpmn:dataOutputAssociation id="DataAssociation_5-output">
<bpmn:targetRef>DataObject_4</bpmn:targetRef>
</bpmn:dataOutputAssociation>
<bpmn:dataOutputAssociation id="DataOutputAssociation_1cvojts">
<bpmn:targetRef>DataObjectReference_1t3shp5</bpmn:targetRef>
</bpmn:dataOutputAssociation>
</bpmn:task>
我想得到这个结果:
TASK NAME DOCUMENTATION
Task_3 Identify Application lorem ipsum 1
Task_2 Define Schedule lorem ipsum 2
提前致谢!
解决方案
主要问题是您的 XML 无效。它缺少<?xml..>
行,并且没有根元素,更不用说声明名称空间了。如果您想使用 Oracle 的 XML 函数,则需要添加它们。
但是,如果您修复您的 XML,那还不错。
-- set up the example data
with DIAGRAM as (select to_clob('<?xml version="1.0" encoding="utf-8"?>
<bpmn:root xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"><bpmn:task id="Task_3" name="Identify Application">
<bpmn:documentation id="Task_3_Documentation">lorem ipsum 1</bpmn:documentation>
<bpmn:incoming>SequenceFlow_4</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_3</bpmn:outgoing>
<bpmn:ioSpecification>
<bpmn:dataInput />
<bpmn:dataOutput />
<bpmn:inputSet>
<bpmn:dataInputRefs>DataObject</bpmn:dataInputRefs>
</bpmn:inputSet>
<bpmn:outputSet>
<bpmn:dataOutputRefs>DataObject_2</bpmn:dataOutputRefs>
</bpmn:outputSet>
</bpmn:ioSpecification>
<bpmn:property id="Property_2" name="__targetRefPlaceholder" />
<bpmn:property id="Property_0nnkfoz" name="__targetRef_placeholder" />
<bpmn:dataInputAssociation id="DataAssociation_4-input">
<bpmn:sourceRef>DataObject</bpmn:sourceRef>
<bpmn:targetRef>Property_2</bpmn:targetRef>
</bpmn:dataInputAssociation>
<bpmn:dataInputAssociation id="DataInputAssociation_0ur4zio">
<bpmn:sourceRef>DataObjectReference_0qo1qcm</bpmn:sourceRef>
<bpmn:targetRef>Property_0nnkfoz</bpmn:targetRef>
</bpmn:dataInputAssociation>
<bpmn:dataOutputAssociation id="DataAssociation_3-output">
<bpmn:targetRef>DataObject_2</bpmn:targetRef>
</bpmn:dataOutputAssociation>
<bpmn:dataOutputAssociation id="DataOutputAssociation_1rae1k7">
<bpmn:targetRef>DataObjectReference_0v1uvlu</bpmn:targetRef>
</bpmn:dataOutputAssociation>
</bpmn:task>
<bpmn:task id="Task_2" name="Define Schedule">
<bpmn:documentation id="Task_2_Documentation">lorem ipsum 2</bpmn:documentation>
<bpmn:incoming>SequenceFlow</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_2</bpmn:outgoing>
<bpmn:ioSpecification>
<bpmn:dataOutput />
<bpmn:inputSet />
<bpmn:outputSet>
<bpmn:dataOutputRefs>DataObject_4</bpmn:dataOutputRefs>
</bpmn:outputSet>
</bpmn:ioSpecification>
<bpmn:dataOutputAssociation id="DataAssociation_5-output">
<bpmn:targetRef>DataObject_4</bpmn:targetRef>
</bpmn:dataOutputAssociation>
<bpmn:dataOutputAssociation id="DataOutputAssociation_1cvojts">
<bpmn:targetRef>DataObjectReference_1t3shp5</bpmn:targetRef>
</bpmn:dataOutputAssociation>
</bpmn:task></bpmn:root>') as xml from dual)
--
-- here's the actual query
select xt.*
from diagram d
cross join xmltable(
xmlnamespaces(default 'http://www.omg.org/spec/BPMN/20100524/MODEL'),
'/root/task' passing xmltype(d.xml)
columns
task varchar2(20) path '@id',
name varchar2(100) path '@name',
documentation varchar2(4000) path 'documentation'
) xt
;
输出:
TASK NAME DOCUMENTATION
Task_3 Identify Application lorem ipsum 1
Task_2 Define Schedule lorem ipsum 2
请注意,该xmlnamespaces()
调用应与您的bpmn
命名空间声明 URL 匹配。另外,我只是按照典型的 Oracle 示例使用 XMLTABLE() 进行交叉连接。如果要同时对表 DIAGRAM 中的多行运行此命令,则需要对其进行修改。
推荐阅读
- arrays - go语言中如何将带有map的struct存储到数组中
- python - 如何按日期范围汇总总和并加入
- java - 想要制作从动态创建的editTexts中获取值的按钮
- angular - 为什么按键事件在两个输入中不起作用?
- javascript - 在 v-for 中绑定不同的事件监听器
- android - 更改 LiveData 时 DataBinding 不更新值
- selenium - Python selenium 将表值获取到列表列表中
- php - 创建 Laravel 项目
- javascript - commonjs和es6模块的去重
- python - 尝试更改熊猫列中的值时发出警报