【问题标题】:Aggregation problems while generating XML生成 XML 时的聚合问题
【发布时间】:2019-12-03 22:32:37
【问题描述】:

我正在尝试使用各种现有函数生成一些 XML,例如 XMLELEMENT、XMLAGG...

但我似乎无法准确地生成我需要的东西。

我需要实现的是:

<GLEntries>
    <GLEntry fac_pk="XXX">
        <FinEntryLine lfa_num="X">
            ...
        </FinEntryLine>
        ...
        <PaymentTerms>
            <PaymentTerm>XX</PaymentTerm>
            ...
        </PaymentTerms>
    </GLEntry>
    ...
</GLEntries>

所以在 GLEntries 中可以有多个 GLEntry,在 GLEntry 中可以有多个 FinEntryLine,在 PaymentTerms 中可以有多个 PaymentTerm。

这是我目前得到的:

<GLEntries>
  <GLEntry entry="000049" status="E">
    <FinEntryLine number="1"/>
    <PaymentTerms>
      <PaymentTerm entry="000049"/>
    </PaymentTerms>
  </GLEntry>
  <GLEntry entry="000049" status="E">
    <FinEntryLine number="2"/>
    <PaymentTerms>
      <PaymentTerm entry="000049"/>
    </PaymentTerms>
  </GLEntry>
</GLEntries>

GLEntry 是一个 invoice(facture table),FinEntryLine 是 invoice_line(ligne_de_facture table)。

使用以下代码:

SELECT XMLSERIALIZE (
          CONTENT XMLELEMENT (
                        "GLEntries",
                        XMLAGG (
                           XMLELEMENT (
                              "GLEntry",
                              xmlattributes (TO_CHAR (fac_num) AS "entry",
                                             'E' AS "status"),
                              XMLCONCAT(XMLELEMENT ("FinEntryLine", xmlattributes(to_char(lfa_num) as "number")
                              )),
                              XMLELEMENT("PaymentTerms",
                                XMLELEMENT("PaymentTerm", xmlattributes(fac_num as "entry"))
                                ))))
          VERSION '1.0')
          AS xmlserialize_doc
  FROM facture,
       ligne_de_facture
 WHERE lfa_fac_fk = fac_pk
 and fac_pk = 365462;

我的问题是 PaymentTerms 元素对于存在的每个 FinEntryLine 都是重复的。

我尝试了多个版本,使用不同的 XMLAGG 和 XMLCONCAT,但找不到像我需要的那样工作的东西。

感谢任何帮助和建议。

编辑:表格定义:

事实:

fac_pk    fac_num
10        000049
20        000050

ligne_de_facture:

lfa_pk    lfa_fac_fk    lfa_num
50        10            1
60        10            2
70        20            1

属性中的其余值是硬编码的。

谢谢

编辑: 在 Ghassan 的建议下,PaymentTerm 只出现一次,但有 2 个 GLEntry 元素,每个元素都有一个 FinEntryLine,我需要 1 个 GLEntry 和 2 个 FinEntryLine。

 <GLEntries>
    <GLEntry entry="000049" status="E">
      <FinEntryLine number="1"/>
    </GLEntry>
    <GLEntry entry="000049" status="E">
      <FinEntryLine number="2"/>
    </GLEntry>
    <PaymentTerms>
      <PaymentTerm entry="000049"/>
    </PaymentTerms>
  </GLEntries>

【问题讨论】:

  • 能否更新您的问题以添加表中的示例数据,以便我们运行您的查询以生成您当前的输出。

标签: xml oracle


【解决方案1】:

由于您没有提供任何数据,table desc,...我想出了一个类似的查询,但使用 user_tables 和 user_tab_columns 视图。问题是您的 XMLAgg 中有 PaymentTerms 元素,您需要它在外部,但这将迫使您在 SQL 中有一个 group by 子句。这是我使用的 SQL:

    SELECT XMLSERIALIZE (
            CONTENT XMLELEMENT (
                            "Tables",
                            XMLAGG (
                            XMLELEMENT (
                                "Columns",
                                xmlattributes (TO_CHAR (column_id) AS "entry",
                                                'E' AS "status"),
                                XMLCONCAT(XMLELEMENT ("FinEntryLine", xmlattributes(to_char(data_length) as "number")
                                )))),
                                XMLELEMENT("PaymentTerms",
                                    XMLELEMENT("PaymentTerm", xmlattributes(t.table_name as "entry"))
                                    ))
            VERSION '1.0')
            AS xmlserialize_doc
    FROM user_tables t,
        user_tab_columns c
    WHERE t.table_name=c.table_name
    and t.table_name ='AVRO_TEST'
    group by t.table_name;

输出的 XML 是:

        <?xml version="1.0"?>
    <Tables>
    <Columns entry="1" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="13" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="12" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="11" status="E">
        <FinEntryLine number="8"/>
    </Columns>
    <Columns entry="10" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="9" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="8" status="E">
        <FinEntryLine number="22"/>
    </Columns>
    <Columns entry="7" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="6" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="5" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="4" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="3" status="E">
        <FinEntryLine number="4000"/>
    </Columns>
    <Columns entry="2" status="E">
        <FinEntryLine number="22"/>
    </Columns>
    <PaymentTerms>
        <PaymentTerm entry="AVRO_TEST"/>
    </PaymentTerms>
    </Tables>

【讨论】:

  • Thnaks,我以为我已经尝试过了,但显然没有。我用我面临的下一个问题更新了我的问题。我无法在 1 个 GLEntry 元素中获得 2 个 FinEntryLine。
  • 您能否在问题中发布 XML 文档的完整示例,以便我们可以尝试使用它而不是发明我们的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多