I am trying to get part of data from CLOB column which contain XML.
I need this because I want to create a report based on this data.
Table structure:
DIAGRAM ( ID number, XML clob );
XML example:
<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>
I want get this results:
TASK NAME DOCUMENTATION Task_3 Identify Application lorem ipsum 1 Task_2 Define Schedule lorem ipsum 2
Thanks in advance!
Advertisement
Answer
The main problem is that your XML is invalid. It’s missing the <?xml..>
line, and it doesn’t have a root element, much less declare the namespaces. You’ll need to add those if you want to use Oracle’s XML functions.
But if you fix your XML, it’s not too bad.
-- 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 ;
Output:
TASK NAME DOCUMENTATION Task_3 Identify Application lorem ipsum 1 Task_2 Define Schedule lorem ipsum 2
Note that the xmlnamespaces()
call should match your bpmn
namespace declaration URL. Also, I’m just following the typical Oracle example of using a cross join with XMLTABLE(). If you want to run this for multiple rows in table DIAGRAM at the same time, you’ll need to modify that.