如何使用 PL SQL 函数从 xmltype 数据生成 xml 报告

Posted

技术标签:

【中文标题】如何使用 PL SQL 函数从 xmltype 数据生成 xml 报告【英文标题】:how to use PL SQL functions to made xml report from xmltype data 【发布时间】:2016-02-19 04:31:18 【问题描述】:

我是 pl/sql 和 xml 的新手。我将以下 xml 数据存储在 oracle 表中。

<?xml version="1.0"?>
<Company>
    <Employee>
        <Programmer>
            <Salary>2000</Salary>
            <Facilities>
                <Car>bmw</Car>
                <Apartment>1</Apartment>
                <Bonus>2000</Bonus>
            </Facilities>
        </Programmer>
        <Manager>
            <Salary>1500</Salary>
            <Facilities>
                <Car>ford</Car>
                <Room>1</Room>
                <Bonus>1500</Bonus>
            </Facilities>
        </Manager>
    </Employee>
</Company>

我想写这样的函数:

getEmployee('Programmer');

返回以下结果:

<Programmer>
    <Salary>2000</Salary>
     <Facilities>
         <Car>bmw</Car>
         <Apartment>1</Apartment>
         <Bonus>2000</Bonus>
    </Facilities>
    </Programmer>

那么如何写这样的函数。请帮忙。谢谢

【问题讨论】:

感谢@Tim Biegeleisen。我将 xml 存储为 xmltype 列。 谢谢@Tim Biegeleisen。你能给我看一些代码示例吗。谢谢 【参考方案1】:

您不需要 PL/SQL 函数来返回部分 XML 文档。您可以只使用XQuery 功能直接SELECT 部分XML 文档。这也意味着如果您想隐藏查询本身,您仍然可以围绕 XQuery SELECT 创建一个 PL/SQL 函数:

CREATE TABLE XMLTEST (xmlcol XMLTYPE);

INSERT INTO XMLTEST (xmlcol) VALUES ('<?xml version="1.0"?>
<Company>
    <Employee>
        <Programmer>
            <Salary>2000</Salary>
            <Facilities>
                <Car>bmw</Car>
                <Apartment>1</Apartment>
                <Bonus>2000</Bonus>
            </Facilities>
        </Programmer>
        <Manager>
            <Salary>1500</Salary>
            <Facilities>
                <Car>ford</Car>
                <Room>1</Room>
                <Bonus>1500</Bonus>
            </Facilities>
        </Manager>
    </Employee>
</Company>');

COMMIT;

SELECT XMLQUERY('//Programmer' PASSING xmlcol RETURNING CONTENT)
  FROM XMLTEST;

<Programmer>
  <Salary>2000</Salary>
  <Facilities>
    <Car>bmw</Car>
    <Apartment>1</Apartment>
    <Bonus>2000</Bonus>
  </Facilities>
</Programmer>

注意: 由于在 QXuery 表达式“//Programmer”中使用了双斜线,上述查询将提取任何称为“Programmer”的标签。如果层次结构是固定的,或者您只想检索下面列出的任何程序员,那么您必须在 XQuery 中相应地指定该路径:

SELECT XMLQUERY('/Company/Employee/Programmer'
                PASSING xmlcol RETURNING CONTENT)
  FROM XMLTEST;

<Programmer>
  <Salary>2000</Salary>
  <Facilities>
    <Car>bmw</Car>
    <Apartment>1</Apartment>
    <Bonus>2000</Bonus>
  </Facilities>
</Programmer>

【讨论】:

您使用的是哪个版本的 Oracle RDBMS?我正在使用 12.1.0.2,它工作正常。也许您需要在以前的版本上显式转换为 XMLTYPE,尝试在插入周围包装一个 XMLTYPE():INSERT INTO XMLTEST (xmlcol) VALUES (XMLTYPE('......')); 关于检索关系数据并将其放入 XML 文档的问题,是的,您可以这样做。但这取决于您是否想完全从关系中生成 XML,只需将工资替换为关系列,在这种情况下您必须加入表,或者您是否想实际更新/替换工资。我强烈建议您看一下XML Developer Guide,它会带您了解所有场景,或者您可以创建一个带有详细解释的新问题。 还是同样的错误?您可以尝试使用 SQL*Plus 吗?它在 LiveSQL 上运行良好,这是我目前唯一的手动环境:livesql.oracle.com/apex/livesql/s/cv9ym8bj8cmtm2hx488mgc4j8 是的,确实如此。我上面提到的文档是针对 11g 的,此外,您说 INSERT 语句引发了错误,而不是 XQuery。我建议您查看文档,您应该可以在其中找到所需的答案。 正如我在上面告诉你的那样,这确实取决于你想要做什么。但由于这完全是一个不同的问题,请创建一个带有详细解释的新问题,包括数据模型和数据的外观。谢谢,

以上是关于如何使用 PL SQL 函数从 xmltype 数据生成 xml 报告的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 比较 XMLTypes

使用 PL/SQL 解析 XML 输出 html 中特定标签的内容

如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?

想在 PL/SQL 中连接两个 XML 元素,想连接两个 XMLTYPE 元素

用于遍历多行的 Oracle PL/SQL 函数

Oracle Pl/SQL:循环通过 XMLTYPE 节点