如何在 Oracle 存储过程中返回 xmltypes 的结果

Posted

技术标签:

【中文标题】如何在 Oracle 存储过程中返回 xmltypes 的结果【英文标题】:How to return a result of xmltypes in Oracle stored procedure 【发布时间】:2012-07-11 05:55:41 【问题描述】:

我有存储过程:

CREATE OR REPLACE udp_get_employeeaddress ( result_set out sys_refcursor )
AS
BEGIN
   open result_set for
   select xmlcolumn from employees where rownum < 3;

END udp_get_employees;

当我执行这个sp时,在SQL Developer的Output Variables中返回以下内容

XML_COLUMN


oracle.jdbc.driver.OracleSQLXML@49e57334

只取出SELECT语句

select xmlcolumn from employees where rownum < 3;

返回xml结果

XML_COLUMN


表定义如下:

CREATE TABLE "EMP"."Employees"
  (
    "ID"              NUMBER,
    "XML_COLUMN" "XMLTYPE"
  )
  xmltype column "XML_COLUMN" STORE AS BINARY XML
  xmlschema "http://www.web.com/emp.xsd"
  element "root"  

我希望我的存储过程返回与独立查询相同的(结果集)。

这是我第一次尝试 Oracle / xml db,因为我主要是 SQL Server DB 开发人员。非常感谢任何帮助。

谢谢

已更新:表定义/查询结果

【问题讨论】:

“结果不一样”是什么意思?如果您只是返回不同的行,那可能是因为这两个语句都没有 order by 子句。 你得到了什么结果,你期望什么结果?我们无法查看您的数据 - 请编辑您的帖子并提供更多信息。 嗨@AlexPoole 这只是一个示例,但为什么这里需要“订购”?本质上,当您只执行 SELECT 语句时,它会返回 xml,当执行该 sp 时,它会在 SQL Dev 的“输出变量”选项卡中返回 jdbc.type。 我已经添加了一个关于 SQL Developer 正在做什么的答案,但作为一个附带问题;如果您的 employees 表有两行以上,则您的 rownum &lt; 3 子句意味着它将基本上随机选择其中的两个。 rownum 过滤器按 Oracle 恰好返回行的顺序。如果您运行 select 并且该过程靠近在一起,您可能会得到相同的两个,它通常可能会满足您的期望,但没有任何保证总有一天会坏掉的。您必须指定 order by 子句以确保您获得预期的行和一致的结果。 另外,不建议使用混合大小写名称创建对象,例如 "Employees",并且可能会在某些时候让您感到痛苦。您必须在双引号中引用该对象,并且在任何地方都使用完全相同的大小写;而如果你只是调用它EMPLOYEES 它将不区分大小写并且不需要引号。 【参考方案1】:

这不是您的过程的问题,但对于 SQL Developer 对输出变量的处理方式似乎有点奇怪 - 我看不到在该选项卡中显示实际内容的方法。

作为替代方法,您可以通过从 SQL 工作表调用它来查看该过程正在运行(作为脚本运行 (F5)):

var rc refcursor;
exec udp_get_employeeaddress(:rc);
print :rc;

【讨论】:

很好,谢谢@Alex...我想这种混淆源于我习惯于 SQL Management Studio 在一个地方(一种方式)获取结果

以上是关于如何在 Oracle 存储过程中返回 xmltypes 的结果的主要内容,如果未能解决你的问题,请参考以下文章

在 ColdFusion 中如何使用 in 变量获取 Oracle 存储过程以返回值?

oracle中的存储过程如何返回查询到的多个值?

oracle如何执行存储过程以及如何返回一个table

oracle 如何返回多条记录

如何使用 RefCursor 返回类型测试 Oracle 存储过程?

Oracle如何创建存储过程和如何调用存储过程