gpt4 book ai didi

oracle - 从 XMLTYPE 解析多列

转载 作者:行者123 更新时间:2023-12-01 03:11:20 26 4
gpt4 key购买 nike

我想从 中选择数据XML 文件使用 Oracle SQL .

这是我的 XML 文件:

<worksheet>
<sheetData>
<row>
<column>
<value>0</value>
</column>
<column>
<value>1</value>
</column>
<column>
<value>2</value>
</column>
</row>
<row>
<column>
<value>3</value>
</column>
<column>
<value>4</value>
</column>
<column>
<value>5</value>
</column>
</row>
<row>
<column>
<value>6</value>
</column>
<column>
<value>7</value>
</column>
<column>
<value>8</value>
</column>
</row>
</sheetData>
</worksheet>

以下代码是 SQL 我用来提取 XML (在 SQL 查询中缩小):
SELECT
*
FROM
XMLTABLE(
'for $i in worksheet/sheetData/row return $i'
PASSING XMLTYPE('<worksheet><sheetData><row><column><value>0</value></column><column><value>1</value></column><column><value>2</value></column></row><row><column><value>3</value></column><column><value>4</value></column><column><value>5</value></column></row><row><column><value>6</value></column><column><value>7</value></column><column><value>8</value></column></row></sheetData></worksheet>')
COLUMNS
column1 CLOB PATH 'column[1]/value',
column2 CLOB PATH 'column[2]/value'
) xml;

这是输出:
---------------------
| COLUMN1 | COLUMN2 |
|---------|---------|
| 0 | 1 |
| 3 | 4 |
| 6 | 7 |
---------------------

你可以看到第三个 <column> <row> 的 child 输出中缺少,但如果我添加 column3 CLOB PATH 'column[3]/value'COLUMNS属性,就会出现。

我的问题是 XML 可以有任意数量的 <column>标签,因为我从一开始就不知道计数,所以我无法定义一个固定的解决方案。

你能帮我告诉我哪个修改应该使我的查询适用于多个 <column>标签?或者哪个查询应该输出 <column>的动态数?

最佳答案

简单的方法

预定义的冗余列数。

SELECT
*
FROM
XMLTABLE(
'/worksheet/sheetData/row'
PASSING XMLTYPE('<worksheet><sheetData><row><column><value>0</value></column><column><value>1</value></column><column><value>2</value></column></row><row><column><value>3</value></column><column><value>4</value></column><column><value>5</value></column></row><row><column><value>6</value></column><column><value>7</value></column><column><value>8</value></column></row></sheetData></worksheet>')
COLUMNS
column_cnt number path 'count(column)',
column1 varchar2(4000) PATH 'column[1]/value',
column2 varchar2(4000) PATH 'column[2]/value',
--etc. ...
column10 varchar2(4000) path 'column[10]/value'
) xml;

旋转结果
SELECT
row_nr,
col_nr,
col_value
FROM
XMLTABLE(
'/worksheet/sheetData/row'
PASSING XMLTYPE('<worksheet><sheetData><row><column><value>0</value></column><column><value>1</value></column><column><value>2</value></column></row><row><column><value>3</value></column><column><value>4</value></column><column><value>5</value></column></row><row><column><value>6</value></column><column><value>7</value></column><column><value>8</value></column></row></sheetData></worksheet>')
COLUMNS
columns_xml xmltype path '.',
row_nr FOR ORDINALITY
) xml
,xmltable('row/column' passing columns_xml
columns
col_nr for ordinality,
col_value varchar2(10) path './value/text()')

硬核方法。
您始终可以使用流水线表函数。

1) 找出最大列数
2) 生成动态类型
3) 填充动态类型
4) 两天后享受用 pl sql 编写的最复杂的代码 :)

下面是管道功能的好例子。这并不完全是您所需要的,但您可以在此基础上进行构建

Return dynamic result set from sys_refcursor

关于oracle - 从 XMLTYPE 解析多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51923005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com