【问题标题】:Retrieve many XMLType from XMLTYPE variable从 XMLTYPE 变量中检索许多 XMLType
【发布时间】:2017-11-21 23:35:02
【问题描述】:

我有这个 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>

而且我需要使&lt;LoteCFe 中的节点&lt;CFe&gt; 检索变量中声明为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>

【问题讨论】:

  • 不是很清楚......你的查询现在返回什么,你想要什么?三个单独的 XMLType 值?

标签: xml oracle xmltype xmltable


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2018-10-06
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多