Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从XMLTYPE解析多个列_Oracle_Xmltype_Dynamic Columns_Xmltable - Fatal编程技术网

Oracle 从XMLTYPE解析多个列

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&

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

这是我的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>
您可以看到输出中缺少
的第三个子
,但是如果我将
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()')