【问题标题】:SQL creating XMLSQL 创建 XML
【发布时间】:2017-01-27 16:23:50
【问题描述】:

我需要在 Oracle 数据库上使用 SQL 生成文件 XML。我很难找到写语法

SELECT 
XMLParse(CONTENT '<company><siret></siret><type></type></company>'WELLFORMED),
(XMLELEMENT("file",
    XMLParse(CONTENT '<data>'WELLFORMED),
    XMLAGG(XMLELEMENT("name",DECODE (INDIV.NAME, null, TRIM(INDIV.NAMEO), TRIM(INDIV.NAME)))),
    XMLAGG(XMLELEMENT("nir",TRIM(INDIV.NIR))),
    XMLAGG(XMLELEMENT("BIRTH",INDIV.DATE_BIRTH)),
    XMLParse(CONTENT '</data><file-formation>'WELLFORMED),
    XMLAGG(XMLELEMENT("id",' ')),
    XMLAGG(XMLELEMENT("statut",' ')),
    XMLAGG(XMLELEMENT("title",' ')),
    XMLAGG(XMLELEMENT("code",' ')), 
    XMLAGG(XMLELEMENT("code-motif",' ')),
    XMLAGG(XMLELEMENT("modalite",' ')),
    XMLParse(CONTENT '<place>'WELLFORMED),
    XMLAGG(XMLELEMENT("code",' ')),
    XMLAGG(XMLELEMENT("city",' ')),
    XMLParse(CONTENT '</place>'WELLFORMED),
    XMLAGG(XMLELEMENT("date-start",' ')),
    XMLAGG(XMLELEMENT("date-end",' ')),
    XMLParse(CONTENT '<orga>'WELLFORMED),
    XMLAGG(XMLELEMENT("siret",' ')),
    XMLAGG(XMLELEMENT("ra",' ')),
    XMLParse(CONTENT '</orga><beneficiaire>'WELLFORMED),
    XMLAGG(XMLELEMENT("statut", DECODE (PRES.INSCRIT_PE, 1, 1, 2))),
    XMLParse(CONTENT '</modalite>'WELLFORMED),
    XMLAGG(XMLELEMENT("time", ACT.HEURE)),
    XMLAGG(XMLELEMENT("cost",' ')))),
    XMLParse(CONTENT '</file-formation></file></cpf:trainning>'WELLFORMED)
FROM 
    STAGIAIRE STAG
    INNER JOIN INDIVIDU INDIV 
    ON STAG.ID_INDIVIDU = INDIV.ID_INDIVIDU
    INNER JOIN PRESCRIPTION PRES 
    ON PRES.ID = STAG.ID
    INNER JOIN ACTION ACT
    ON ACT.ID_ACTION = PRES.ID_ACTION
    INNER JOIN PARCOURS PARC 
    ON PARC.ID = ACT.ID;

如您所见,我的最终 XML 文件中有很多空数据,但目前我的 XML 中只有名称... 如何在 XMLAGG 之后添加我的所有 XMLELEMENT

更准确地说,我需要创建以下 XML。第一部分 &lt;company&gt;&lt;/company&gt; 对于我将创建的每个 XML 文档都是相同的,然后对于第二部分 &lt;file&gt;&lt;/file&gt; 我需要在我的数据库中拥有与 &lt;file&gt; 一样多的 &lt;file&gt;

<company>
<siret></siret>
<type></type>
</company>

<file>
    <data>
        <name>DECODE (INDIV.NAME, null, TRIM(INDIV.NAMEO), TRIM(INDIV.NAME)</name>
            <nir>TRIM(INDIV.NIR)</nir>
            <birth> INDIV.DATE_BIRTH</birth>
    </data>
    <file-formation>
            <id></id>
            <statut></statut>
            <title></title>
            <code></code> 
            <code-motif></codeMotif>
            <modalite></modalite>
            <place>
                <code></code>
                <city></city>
            </place>
            <date-start></date-start>
            <date-end></date-end>
            <orga></orga>
            <siret></siret>
            <ra></ra>
            <beneficiaire>
                <statut> DECODE (PRES.INSCRIT_PE, 1, 1, 2)</statut>
            <time>ACT.HEURE</time>
            <cost></cost>
    </file-formation>
</file>

我理解我的错误,所以我在&lt;file&gt; 元素之前添加了 XMLAGG,但它仍然无法正常工作...我应该有一个包含超过 3000 个&lt;file&gt; 的文件,而我只有一行... 我很难找到正确的方法

SELECT 
XMLParse(CONTENT '<company><siret></siret><type></type></company>'WELLFORMED),
XMLAGG(XMLELEMENT("file",
    XMLParse(CONTENT '<data>'WELLFORMED),
    (XMLELEMENT("name",DECODE (INDIV.NAME, null, TRIM(INDIV.NAMEO), TRIM(INDIV.NAME)))),
    (XMLELEMENT("nir",TRIM(INDIV.NIR))),
    (XMLELEMENT("BIRTH",INDIV.DATE_BIRTH)),
    XMLParse(CONTENT '</data><file-formation>'WELLFORMED),
    (XMLELEMENT("id",' ')),
    (XMLELEMENT("statut",' ')),
    (XMLELEMENT("title",' ')),
    (XMLELEMENT("code",' ')), 
    (XMLELEMENT("code-motif",' ')),
    (XMLELEMENT("modalite",' ')),
    XMLParse(CONTENT '<place>'WELLFORMED),
    (XMLELEMENT("code",' ')),
    (XMLELEMENT("city",' ')),
    XMLParse(CONTENT '</place>'WELLFORMED),
    (XMLELEMENT("date-start",' ')),
    (XMLELEMENT("date-end",' ')),
    XMLParse(CONTENT '<orga>'WELLFORMED),
    (XMLELEMENT("siret",' ')),
    (XMLELEMENT("ra",' ')),
    XMLParse(CONTENT '</orga><beneficiaire>'WELLFORMED),
    (XMLELEMENT("statut", DECODE (PRES.INSCRIT_PE, 1, 1, 2))),
    XMLParse(CONTENT '</modalite>'WELLFORMED),
    (XMLELEMENT("time", ACT.HEURE)),
    (XMLELEMENT("cost",' ')))),
    XMLParse(CONTENT '</file-formation></file></cpf:trainning>'WELLFORMED)
FROM 
    STAGIAIRE STAG
    INNER JOIN INDIVIDU INDIV 
    ON STAG.ID_INDIVIDU = INDIV.ID_INDIVIDU
    INNER JOIN PRESCRIPTION PRES 
    ON PRES.ID = STAG.ID
    INNER JOIN ACTION ACT

【问题讨论】:

  • "如您所见..." - 您没有向我们展示您引用的最终 XML 文件、原始数据或您实际想要的输出。不确定您希望我们在没有任何信息的情况下能做什么?

标签: sql xml oracle


【解决方案1】:

不太确定你的问题是什么,但也许这会有所帮助,或者帮助其他人。

我使用 XMLAGG 来聚合一组 XMLELEMENT,如下所示

SELECT XMLAGG(XMLELEMENT("f1",v1),XMLELEMENT("f2", v2),...

我会从小处着手,并以此为基础。

以下是一些用于生成虚构 SOAP 请求的 SQL 的小型工作示例:

SELECT 
  XMLROOT( 
    XMLELEMENT("soap:Envelope", 
              XMLATTRIBUTES('http://www.w3.org/2001/XMLSchema-instance' AS "xmlns:xsi"
                              , 'http://www.w3.org/2001/XMLSchema' AS "xmlns:xsd"
                              , 'http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soap"),
      XMLELEMENT("soap:Body",
        XMLELEMENT("serviceName", XMLATTRIBUTES('http://myserver.com/TheWebService/' AS "xmlns"),
          XMLCONCAT(
            XMLELEMENT("cd" 
            , XMLCONCAT(
                (SELECT XMLAGG(
                          XMLELEMENT("G1"
                           , XMLELEMENT("E1", v1)
                           , XMLELEMENT("E2", v2)
                           , CASE WHEN v3 IS NOT NULL
                                  THEN XMLELEMENT("E3", v3)
                                  ELSE XMLELEMENT("E3"
                                        , XMLATTRIBUTES('true' AS "xsi:nil"), NULL)
                             END
                           , XMLELEMENT("E4", v4)))
                   FROM (SELECT 'v1' v1, 'v2' v2, 'v3' v3, 'v4' v4 FROM dual))
              )  -- XMLConcat
            )  -- cd
          )  -- XMLConcat
        )  -- serviceName
      )  -- soap:Body 
    )  -- soap:Envelope
    , VERSION '1.0'
  ).getclobval()
  FROM dual;

还有输出:

<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <serviceName xmlns="http://myserver.com/TheWebService/">
      <cd>
        <G1>
          <E1>v1</E1>
          <E2>v2</E2>
          <E3>v3</E3>
          <E4>v4</E4>
        </G1>
      </cd>
    </serviceName>
  </soap:Body>
</soap:Envelope>

希望这里有一些东西可以回答您的问题。您应该能够按原样运行它以生成 XML 文档。关键是从小处着手,并根据需要添加其他元素。

【讨论】:

  • XMLCONCAT 是什么?
  • 感谢 DCookie!和模特一起工作真的很棒。太棒了:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2016-05-28
相关资源
最近更新 更多