如何在 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 < 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 存储过程以返回值?