2016-06-16 4 views
0

У меня есть PL \ SQL, который возвращает набор данных, который по существу проверяет тома по счету || продукт в двух разных таблицах.Настройка SYS_REFCURSOR в PL SQL для возврата набора данных

Моя конечная цель состоит в том, чтобы этот набор данных вытащил непосредственно в электронную таблицу (используя Excel-VBA), передав параметры даты (предоставленные через Excel) и вызвав хранимую процедуру.

После чтения бит на 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. 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

Вы создаете процедуру Oracle, и процедура не может иметь ключевое слово RETURN с указанным возвращаемым типом данных. Создайте функцию Oracle, чтобы делать то, что вы хотите сделать.

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