使用Oracle解析具有多个子节点的XML

thigvfpy  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(255)

我需要在Oracle中解析具有多个子元素的XML,但我一直得到多项序列错误。我看到之前讨论过这个问题,我尝试了交叉连接两个XMLTABLE的方法,但它仍然不起作用,我想我被卡住了。你能提出一个解决方案吗?
这就是XML:

<dataView>
   <categoryId>22</categoryId>
   <tableReferenceId>2533050</tableReferenceId>
   <noOfColumnsToFixHorizontally>0</noOfColumnsToFixHorizontally>
   <fieldOptions>
      <id>2533805</id>
      <fieldId>2446226</fieldId>
      <entityId>2446223</entityId>
      <fieldHeaderLabel>Product ID</fieldHeaderLabel>
      <displayedByDefault>true</displayedByDefault>
      <filterableAndSortable>true</filterableAndSortable>
      <quickFilterValues>Laptops</quickFilterValues>
      <quickFilterValues>Monitors</quickFilterValues>
      <quickFilterValues>PCs</quickFilterValues>
      <columnWidth>MEDIUM_SMALL</columnWidth>
      <fieldType>DVFO_DATA</fieldType>
   </fieldOptions>
   <fieldOptions>
      <id>2533806</id>
      <fieldId>563</fieldId>
      <fieldHeaderLabel>Quarter</fieldHeaderLabel>
      <displayedByDefault>true</displayedByDefault>
      <filterableAndSortable>true</filterableAndSortable>
      <quickFilterValues>Quarter 3 2016</quickFilterValues>
      <quickFilterValues>Quarter 4 2016</quickFilterValues>
      <quickFilterValues>Quarter 1 2017</quickFilterValues>
      <quickFilterValues>Quarter 2 2017</quickFilterValues>
      <columnWidth>MEDIUM_SMALL</columnWidth>
      <fieldType>DVFO_DATA</fieldType>
   </fieldOptions>
</dataView>

预期结果将是quickFilterValues节点中的非重复值:
| |
| - -----|
| 笔记本电脑|
| 显示器|
| 个人电脑|
| 2016年第三季度|
| 2016年第四季度|
| 2017年第一季度|
| 2017年第二季度|
这是我尝试使用的一个查询:

with plm as (select '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataView><categoryId>22</categoryId><tableReferenceId>2533050</tableReferenceId><noOfColumnsToFixHorizontally>0</noOfColumnsToFixHorizontally><fieldOptions><id>2533805</id><fieldId>2446226</fieldId><entityId>2446223</entityId><fieldHeaderLabel>Product ID</fieldHeaderLabel><displayedByDefault>true</displayedByDefault><filterableAndSortable>true</filterableAndSortable><quickFilterValues>Laptops</quickFilterValues><quickFilterValues>Monitors</quickFilterValues><quickFilterValues>PCs</quickFilterValues><columnWidth>MEDIUM_SMALL</columnWidth><fieldType>DVFO_DATA</fieldType></fieldOptions><fieldOptions><id>2533806</id><fieldId>563</fieldId><fieldHeaderLabel>Quarter</fieldHeaderLabel><displayedByDefault>true</displayedByDefault><filterableAndSortable>true</filterableAndSortable><quickFilterValues>Quarter 3 2016</quickFilterValues><quickFilterValues>Quarter 4 2016</quickFilterValues><quickFilterValues>Quarter 1 2017</quickFilterValues><quickFilterValues>Quarter 2 2017</quickFilterValues><columnWidth>MEDIUM_SMALL</columnWidth><fieldType>DVFO_DATA</fieldType></fieldOptions></dataView>
' x from dual)
SELECT *
  FROM plm, 
       XMLTable('/dataView/fieldOptions'
                PASSING xmltype(x)
                COLUMNS
                   fo  VARCHAR2(250) PATH 'quickFilterValues'
               )

但我得到了错误:
ORA-19279:XPTY 0004- XQuery动态类型不匹配:期望的单例序列-得到多项序列19279。00000 -“XPTY 0004- XQuery动态类型不匹配:预期的单例序列-得到多项序列”* 原因:传入的XQuery序列有多个项。* 操作:更正XQuery表达式以返回单个项序列。

6jjcrrmo

6jjcrrmo1#

您可以用途:

SELECT x.fo
FROM   plm p
       CROSS APPLY XMLTable(
         '/dataView/fieldOptions/quickFilterValues'
         PASSING xmltype(p.x)
         COLUMNS
           fo  VARCHAR2(250) PATH '.'
      ) x

其中,对于样本数据:

CREATE TABLE plm (x) AS
SELECT '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataView><categoryId>22</categoryId><tableReferenceId>2533050</tableReferenceId><noOfColumnsToFixHorizontally>0</noOfColumnsToFixHorizontally><fieldOptions><id>2533805</id><fieldId>2446226</fieldId><entityId>2446223</entityId><fieldHeaderLabel>Product ID</fieldHeaderLabel><displayedByDefault>true</displayedByDefault><filterableAndSortable>true</filterableAndSortable><quickFilterValues>Laptops</quickFilterValues><quickFilterValues>Monitors</quickFilterValues><quickFilterValues>PCs</quickFilterValues><columnWidth>MEDIUM_SMALL</columnWidth><fieldType>DVFO_DATA</fieldType></fieldOptions><fieldOptions><id>2533806</id><fieldId>563</fieldId><fieldHeaderLabel>Quarter</fieldHeaderLabel><displayedByDefault>true</displayedByDefault><filterableAndSortable>true</filterableAndSortable><quickFilterValues>Quarter 3 2016</quickFilterValues><quickFilterValues>Quarter 4 2016</quickFilterValues><quickFilterValues>Quarter 1 2017</quickFilterValues><quickFilterValues>Quarter 2 2017</quickFilterValues><columnWidth>MEDIUM_SMALL</columnWidth><fieldType>DVFO_DATA</fieldType></fieldOptions></dataView>' FROM DUAL;

输出:
| FO|
| - -----|
| 笔记本电脑|
| 显示器|
| 个人电脑|
| 2016年第三季度|
| 2016年第四季度|
| 2017年第一季度|
| 2017年第二季度|
fiddle

相关问题