Oracle 从XMLTYPE解析多个列
我想使用Oracle SQL从XML文件中选择数据 这是我的XML文件:Oracle 从XMLTYPE解析多个列,oracle,xmltype,dynamic-columns,xmltable,Oracle,Xmltype,Dynamic Columns,Xmltable,我想使用Oracle SQL从XML文件中选择数据 这是我的XML文件: <worksheet> <sheetData> <row> <column> <value>0</value> </column> <column> <value&
<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>
您可以看到输出中缺少
的第三个子
,但是如果我将column3 CLOB PATH'column[3]/value'
添加到COLUMNS
属性中,它就会出现
我的问题是XML可以有任意数量的
标记,而且由于我从一开始就不知道计数,因此无法定义固定的解决方案
您能告诉我应该通过哪些修改使我的查询适用于多个
标记吗?或者哪个查询应该输出动态数量的
?简易方法
预定义的列冗余量
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;
选择
*
从…起
XMLTABLE(
“/worksheet/sheetData/row”
正在传递XMLTYPE('012345678')
柱
列号路径“计数(列)”,
column1 varchar2(4000)路径“column[1]/value”,
column2 varchar2(4000)路径“column[2]/value”,
--等等。。。
column10 varchar2(4000)路径“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()')
选择
北行,
上校,
col_值
从…起
XMLTABLE(
“/worksheet/sheetData/row”
正在传递XMLTYPE('012345678')
柱
列_xmlxmltype路径“.”,
普通性的第行
)xml
,xmltable('行/列'传递列\u xml
柱
普通性方面的协调,
col_value varchar2(10)路径“./value/text()”)
核心方法。
始终可以使用流水线表函数
1) 查找最大列数2) 生成动态类型
3) 填充动态类型
4) 两天后,您将欣赏用pl sql编写的最复杂的代码:) 下面是胡椒碱功能的好例子。这并不完全是你所需要的,但你可以在此基础上继续努力
查询sting
“/worksheet/sheetData/row”
就足够了,您不需要为。。。在
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()')