【发布时间】:2019-04-21 21:23:49
【问题描述】:
我有示例 xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<tns:getAbcResponse xmlns:tns="http://xyz.abc.com">
<abc-name>CONTRACT_STATUS</abc-name>
<abc-values>
<attribute>
<name>7</name>
<value-list>
<value>
<name>CONTRACT_STATUS</name>
<value>xyzabc</value>
</value>
<value>
<name>CONTRACT_STATUS_DESC</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_SYSTEM</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_VALUE</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_DESC</name>
<value>xyzabc</value>
</value>
<value>
<name>VISIBLE</name>
<value>xyzabc</value>
</value>
<value>
<name>REQUIRED</name>
<value>xyzabc</value>
</value>
</value-list>
</attribute>
<attribute>
<name>7</name>
<value-list>
<value>
<name>CONTRACT_STATUS</name>
<value>xyzabc</value>
</value>
<value>
<name>CONTRACT_STATUS_DESC</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_SYSTEM</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_VALUE</name>
<value>xyzabc</value>
</value>
<value>
<name>SOURCE_DESC</name>
<value>xyzabc</value>
</value>
<value>
<name>VISIBLE</name>
<value>xyzabc</value>
</value>
<value>
<name>REQUIRED</name>
<value>xyzabc</value>
</value>
</value-list>
</attribute>
</abc-values>
<status error-code="0">
<error-msg>OK</error-msg>
</status>
</tns:getAbcResponse>
</soapenv:Body>
</soapenv:Envelope>
在此示例中,一个<attribute> 标记为 1 行,我需要将其插入到表中。
我设法构建了一个查询:
with response(xm) as ( select xmltype('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><tns:getAbcResponse xmlns:tns="http://xyz.abc.com"><abc-name>CONTRACT_STATUS</abc-name><abc-values>
<attribute><name>7</name><value-list><value><name>CONTRACT_STATUS</name><value>xyzabc</value></value><value><name>CONTRACT_STATUS_DESC</name><value>xyzabc</value></value><value><name>SOURCE_SYSTEM</name><value>xyzabc</value></value><value><name>SOURCE_VALUE</name><value>xyzabc</value></value><value><name>SOURCE_DESC</name><value>xyzabc</value></value><value><name>VISIBLE</name><value>xyzabc</value></value><value><name>REQUIRED</name><value>xyzabc</value></value></value-list></attribute>
<attribute><name>7</name><value-list><value><name>CONTRACT_STATUS</name><value>xyzabc</value></value><value><name>CONTRACT_STATUS_DESC</name><value>xyzabc</value></value><value><name>SOURCE_SYSTEM</name><value>xyzabc</value></value><value><name>SOURCE_VALUE</name><value>xyzabc</value></value><value><name>SOURCE_DESC</name><value>xyzabc</value></value><value><name>VISIBLE</name><value>xyzabc</value></value><value><name>REQUIRED</name><value>xyzabc</value></value></value-list></attribute>
</abc-values><status error-code="0"><error-msg>OK</error-msg></status></tns:getAbcResponse></soapenv:Body></soapenv:Envelope>')from dual)
SELECT n.att_name AS name,
v.name AS att_name,
v.value AS att_value
FROM response r,
XMLTABLE
(
'//abc-values/attribute'
PASSING r.xm
COLUMNS
att_name VARCHAR2(30) PATH 'name',
value_list XMLTYPE PATH 'value-list'
) n,
XMLTABLE
(
'value-list/value'
PASSING n.value_list
COLUMNS
name varchar2(30) PATH 'name',
value varchar2(30) PATH 'value'
) v;
采用这种方法,我需要:
- 从此查询中获取前 7 行,
- 转化为单个插入查询->执行/放入集合
- 从此查询中获取接下来的 7 行
- 等
换一种方式:
注意:name 列是某种 id,对表 v 中的每一行重复。
我完全不知道如何实现这一点。 任何想法,不同的方法都将受到欢迎。
谢谢:)
【问题讨论】:
-
前 7 行与后 7 行的区别是什么?我的意思是,您的样本数据对于所有内容都是相同的(例如,两组在相同的位置具有相同的值)。总是 7 行吗?
-
我只是混淆了数据。
-
它有助于提供准确反映您要处理的要求的示例数据!
-
在这种情况下它真的没有。我正在尝试对列名(如contract_status、source_system)进行操作,因此机制应该不会给出关于数据的cr...。如果 xml 包含 'xyz' - 程序将插入 'xyz'。如果'abc'则'abc'。如果对您有帮助,您可以在每个“xyzabc”的末尾添加一个不同的数字。
-
确实如此。如果所有数据都相同,您怎么知道您在正确的位置获取正确的值?事实上,我在示例数据中添加了数字,以便在我的回答中清晰,因此您可以确定这些值按预期返回。那确实应该由您完成,因为您是寻求帮助的人。请确保您在下次提出问题时提供有用的示例数据,以免浪费大家的时间。
标签: xml oracle web-services plsql