从XMLTYPE变量中检索许多XMLType

时间:2017-11-21 23:35:03

标签: xml oracle xmltype xmltable

我有这个XML:

<envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">
    <tpAmb>1</tpAmb>
    <idLote>4100</idLote>
    <cUF>35</cUF>
    <LoteCFe>
        <CFe>
            <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
            </infCFe>
        </CFe>
        <CFe>
            <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
            </infCFe>
        </CFe>
        <CFe>
            <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
            </infCFe>
        </CFe>
    <dhEnvio>20171106081311</dhEnvio>
    <nserieSAT>000081226</nserieSAT>
</envCFe>

我需要让<CFe>内的节点<LoteCFe在变量声明中检索尽可能多的XMLTYPE

要将参数传递给另一个过程,为简化起见:

SELECT
X.nodeCFe
FROM
XMLTABLE(
    '/envCFe/LoteCFe'
    PASSING XMLTYPE(
        '<envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">
        <tpAmb>1</tpAmb>
        <idLote>4100</idLote>
        <cUF>35</cUF>
        <LoteCFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <dhEnvio>20171106081311</dhEnvio>
            <nserieSAT>000081226</nserieSAT>
        </LoteCFe>
    </envCFe>'
    )
    COLUMNS
        nodeCFe XMLTYPE PATH 'CFe'
) X
;

我把这个结果作为表格会出错?

nodeCFe
-------
<CFe><infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100"></infCFe</CFe>
<CFe><infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100"></infCFe</CFe>
<CFe><infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100"></infCFe</CFe>

1 个答案:

答案 0 :(得分:1)

您的根节点声明了一个名称空间,因此您需要在查询中处理该名称空间;你可以使用默认的XMLNamespaces子句来做到这一点。您还需要XPath转到要提取的节点:

SELECT
X.nodeCFe
FROM
XMLTABLE(
    XMLNAMESPACES(default 'http://www.fazenda.sp.gov.br/sat'),
    '/envCFe/LoteCFe/CFe'
    PASSING XMLTYPE(
...

使用您的数据:

SELECT
X.nodeCFe
FROM
XMLTABLE(
    XMLNAMESPACES(default 'http://www.fazenda.sp.gov.br/sat'),
    '/envCFe/LoteCFe/CFe'
    PASSING XMLTYPE(
        '<envCFe versao="0.07" xmlns="http://www.fazenda.sp.gov.br/sat">
        <tpAmb>1</tpAmb>
        <idLote>4100</idLote>
        <cUF>35</cUF>
        <LoteCFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <CFe>
                <infCFe versao="0.07" versaoDadosEnt="0.07" versaoSB="020100">
                </infCFe>
            </CFe>
            <dhEnvio>20171106081311</dhEnvio>
            <nserieSAT>000081226</nserieSAT>
        </LoteCFe>
    </envCFe>'
    )
    COLUMNS
        nodeCFe XMLTYPE PATH '.'
) X
;

NODECFE                                                                         
--------------------------------------------------------------------------------
<CFe xmlns="http://www.fazenda.sp.gov.br/sat"><infCFe versao="0.07" versaoDadosE
nt="0.07" versaoSB="020100">
                </infCFe></CFe>

<CFe xmlns="http://www.fazenda.sp.gov.br/sat"><infCFe versao="0.07" versaoDadosE
nt="0.07" versaoSB="020100">
                </infCFe></CFe>

<CFe xmlns="http://www.fazenda.sp.gov.br/sat"><infCFe versao="0.07" versaoDadosE
nt="0.07" versaoSB="020100">
                </infCFe></CFe>