2016-06-16 12 views
0

私は、2つの異なるテーブルでaccount || productによって本質的にボリュームを検証するデータセットを返すPL \ SQLを持っています。PL¥SQLのSYS_REFCURSORをデータセットを返すように設定する

私の最終目標は、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

関数を作成しようとすると、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; 
2

プロシージャは、指定された戻りデータ型を持つRETURNキーワードを持つことはできません。あなたがやりたいことをするためのOracle関数を作成します。

CREATE OR REPLACE FUNCTION FUN_REG_SPLIT_RECON 
... 
RETURN SYS_REFCURSOR 
.... 
関連する問題