如何使用 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 解析 XML 输出 html 中特定标签的内容
如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?