在 PL\SQL 到 return 数据集中设置 SYS_REFCURSOR

Setting Up SYS_REFCURSOR in PL\SQL to return dataset

我有一个 PL\SQL,return 是一个数据集,它本质上是在两个不同的表中按帐户||产品验证交易量。

我的最终目标是通过传递日期参数(通过 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,查询工作正常并且 return 结果符合预期。有谁知道为什么我的 PL\SQL 没有编译?或者如果我的方法偏离了基础?

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

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

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

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;