【问题标题】:Generate XML document in PL/SQL from Oracle tables从 Oracle 表生成 PL/SQL 中的 XML 文档
【发布时间】:2010-12-21 18:21:25
【问题描述】:

我必须在 PL/SQL 中从 Oracle 中的一些表生成 XML 文档。我以前从未这样做过,我发现似乎有几种主要方法可以做到这一点:

  • xmldom API
  • xml函数(如xmlelement、xmlagg、xmlroot)
  • dbms_xmlgen 函数

将引用 65 个表来生成单个文档,并且我必须根据 xsd 验证输出。文档将批量生成(而不是按需生成)——我不知道这是否会有所不同。使用 Oracle 10g。

我最初倾向于使用 xmldom 包,因为它看起来更灵活,但我很难为它找到好的示例或文档,而 xml 函数似乎有更好的文档记录并且通常更受欢迎。这是有原因的吗?

对于此类任务,人们通常推荐什么方法?

【问题讨论】:

    标签: xml oracle plsql xmldom


    【解决方案1】:

    根据我的经验,DBMS_XMLGEN 非常适合快速而肮脏的数据到 xml 的转换,但我一直不太喜欢它,因为您必须将 SQL 作为字符串传递。此外,您对元素名称和 ROWSET/ROW 结构的控制受到严重限制。

    XML 函数非常方便,如果您处理相对简单的结构,我最喜欢它。例如,一旦你进入多个 XMLAgg 级别,我发现它很快就会变成一团糟。

    XMLDOM 是生成 XML 最灵活的方式,尤其是在结构更复杂或涉及迭代逻辑的情况下。这里的主要缺点是它本质上是一个围绕 Java DOM 的包装器,其中大多数方法都接受 DOMNode 输入,但 PL/SQL 不直接支持多态性,因此最终会在 DOMElement 和 DOMNode 之间进行大量显式转换反之亦然,等等。通常我会创建自己的重载程序包来封装所有这些,并使其使用起来不那么痛苦。

    【讨论】:

    • 与其他方法相比,XMLDOM 的性能(特别是:速度)如何?此代码将生成 min。批量 10k 个文件。我知道可能开始担心性能优化有点为时过早,但如果现在的选择可能会在以后产生非常严重的影响,我宁愿现在担心它,而不必稍后重写。
    • 我从来没有为了比较的目的测量性能,但我怀疑在任何这些情况下,主要因素是底层查询,而不是结果的 XML 化。我发现 XMLDOM 的唯一“陷阱”是您必须显式调用 freeDocument 方法以在完成该文档后释放您一直在使用的内存。
    【解决方案2】:

    好吧,我从来没有使用 Oracle 来生成任何非常复杂的 XML 文档,但是使用 DBMS_XMLDOC 非常容易。

    您可能会看到一个骨架here(和here,只有pl/sql 代码)。也使用谷歌代码搜索,肯定还有更多的东西可以找到。
    然后是DBMS_XMLDOM reference,即使文档相当枯燥,它也会有所帮助。

    确保您还阅读了这两个帖子:
    http://www.liberidu.com/blog/?p=365
    http://www.liberidu.com/blog/?p=369

    您也可以考虑使用 Java 存储过程生成 XML。

    【讨论】:

    • 我已经看过前两个链接,但是 DBMS_XMLDOM 引用是新的。谢谢你的链接!!
    【解决方案3】:

    我通常使用 xml 函数(XMLElementXMLForest 等),因为我可以控制 XSD。我使 XSD 与文档的结构大致匹配,因此它们很好地匹配在一起。

    如果您尝试使用的架构非常复杂或时髦,您应该考虑使用DBMS_XMLGENDOM 方法。

    【讨论】:

      【解决方案4】:

      以下是对您可用的一些选项的很好讨论:

      http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4980337843276

      此外,如果您在 AskTom 上搜索“Sean Dillon”,您将获得大量文章,其中详细介绍了在 Oracle 中使用 XML 的各种问题和解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 2020-03-31
        • 2017-12-18
        • 2014-03-29
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多