在 PL\SQL 中设置 SYS_REFCURSOR 以返回数据集

Posted

技术标签:

【中文标题】在 PL\\SQL 中设置 SYS_REFCURSOR 以返回数据集【英文标题】:Setting Up SYS_REFCURSOR in PL\SQL to return dataset在 PL\SQL 中设置 SYS_REFCURSOR 以返回数据集 【发布时间】:2016-06-16 22:02:14 【问题描述】:

我有一个 PL\SQL,它返回一个数据集,该数据集基本上按帐户||产品在两个不同的表中验证卷。

我的最终目标是通过传递日期参数(通过 Excel 提供)并调用存储过程,将这个数据集直接拉入电子表格(使用 Excel-VBA)。

在阅读了一些关于 PL\SQL 的内容后,我似乎需要一个游标变量来存储提供的最终结果数据集,以便我可以将其写入电子表格(作为记录集)。

按照网上的例子,我的程序是这样写的

CREATE OR REPLACE PROCEDURE PROC_REG_SPLIT_RECON (dStart IN Date, dEnd IN Date) 
-- procedure to check regional splits creation is okay
-- procedure checks volumes by account and product from FACT_TRADE_PRESPLIT_ROLLUP to FACT_TRADE_ROLLUP

-- SQLDeveloper doesn't like this section and I can't figure out how to set this up correctly, no matter what I do and research.

RETURN SYS_REFCURSOR 
AS 
l_return SYS_REFCURSOR; 
-- end of section not working

BEGIN

OPEN l_return FOR 

    SELECT OpStats.Account, OpStats.Platform, OpStats.Volume OpStatsVol, RegSplits.Volume RegSplitsVol, (OpStats.Volume-RegSplits.Volume) Difference FROM

   (a bunch of union queries) OpStats,

   (a bunch of other union queries) RegSplits

WHERE OpStats.Account = RegSplits.Account (+) And OpStats.Platform = RegSplits.Platform (+)
ORDER BY OpStats.Account ASC, OPStats.Platform DESC;

RETURN l_return;

END;

FWIW,查询工作正常并按预期返回结果。有谁知道为什么我的 PL\SQL 没有编译?或者如果我的方法偏离了基础?

【问题讨论】:

【参考方案1】:

您正在创建一个 Oracle 过程,并且该过程不能具有具有指定返回数据类型的 RETURN 关键字。创建一个 Oracle 函数来做你想做的事情。

CREATE OR REPLACE FUNCTION FUN_REG_SPLIT_RECON 
...
RETURN SYS_REFCURSOR
....

【讨论】:

【参考方案2】:

尝试创建函数,因为 RETURN 语句仅在 FUCNTION 中使用。 PROCEDURE 中的 RETURN 语句仅用于在所需位置正常终止过程。希望下面的代码有所帮助。

CREATE OR REPLACE FUNCTION PROC_REG_SPLIT_RECON( --Function has to be incorporated
    dStart IN DATE,
    dEnd   IN DATE)
  -- procedure to check regional splits creation is okay
  -- procedure checks volumes by account and product from FACT_TRADE_PRESPLIT_ROLLUP to FACT_TRADE_ROLLUP
  -- SQLDeveloper doesn't like this section and I can't figure out how to set this up correctly, no matter what I do and research.
  RETURN SYS_REFCURSOR
AS
  l_return SYS_REFCURSOR;
  -- end of section not working
BEGIN
  OPEN l_return FOR SELECT OpStats.Account, OpStats.Platform, OpStats.Volume OpStatsVol, RegSplits.Volume RegSplitsVol, (OpStats.Volume-RegSplits.Volume) Difference FROM (a bunch OF
  UNION queries) OpStats, (a bunch OF other
  UNION queries) RegSplits WHERE OpStats.Account = RegSplits.Account (+) AND OpStats.Platform = RegSplits.Platform (+) ORDER BY OpStats.Account ASC, OPStats.Platform DESC;
  RETURN l_return;
END;

【讨论】:

以上是关于在 PL\SQL 中设置 SYS_REFCURSOR 以返回数据集的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 或 PL/SQL:如何仅在上升趋势或下降趋势结束时识别烛台形态并在列中设置标志?

错误:TCP 提供程序:错误代码 0x2746。在通过终端在linux中设置Sql期间

无输出,仅显示“PL/SQL 过程已成功完成”

SQL记录-PLSQL面向对象

在xib中设置accessibilityIdentifier nil时,必须从用户定义的运行时属性中设置

在 RichTextBox WPF 中设置文化/语言