Как получить данные из Курсора Oracle / Toad - PullRequest
0 голосов
/ 07 января 2019

У меня есть функция, которая возвращает курсор с несколькими значениями даты, и мне нужно извлечь эти данные один за другим в это:

CALLMISUSER01.INSERT_DEP004(First data of the cursor, Second data of the cursor, Third data of the cursor. . . etc);

моя основная функция:

Create or replace FUNCTION Rep_dates(pdt_ref_date IN DATE)
RETURN SYS_REFCURSOR IS
    pcr_result SYS_REFCURSOR;
BEGIN
    OPEN pcr_result FOR
    SELECT  
        trunc(pdt_ref_date),
        trunc(pdt_ref_date) - 1,
        trunc(pdt_ref_date) - 2,
        trunc(pdt_ref_date) - 3,
        trunc(pdt_ref_date, 'mm'),       
        add_months(trunc(pdt_ref_date, 'MM'), -1) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -2) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -3) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'Q'), -6) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -9) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -12) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -15) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -18) first_day_of_last_quarter
    FROM dual;

    RETURN pcr_result;
END;

1 Ответ

0 голосов
/ 07 января 2019

Во-первых, укажите правильные псевдонимы для столбцов, возвращаемых из вашей функции как REF CURSOR. Затем вы можете определить соответствующий RECORD тип и FETCH курсор в нем. Это один метод, который вы можете ссылаться на отдельные столбцы. Другой вариант - определить отдельные переменные для каждого столбца.

Функция

CREATE OR REPLACE FUNCTION rep_dates(pdt_ref_date IN DATE)
RETURN SYS_REFCURSOR IS
    pcr_result SYS_REFCURSOR;
BEGIN
    OPEN pcr_result FOR
    SELECT  
        trunc(pdt_ref_date) as  pdt_ref_date,
        trunc(pdt_ref_date) - 1 pdt_ref_date_1,
        trunc(pdt_ref_date) - 2 pdt_ref_date_2,
        trunc(pdt_ref_date) - 3 pdt_ref_date_3,
        trunc(pdt_ref_date, 'mm') as pdt_ref_date_mon ,       
        add_months(trunc(pdt_ref_date, 'MM'), -1) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -2) first_day_of_2nd_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -3) first_day_of_3rd_last_month,
        add_months(trunc(pdt_ref_date, 'Q'), -6) first_day_of_last_quarter_1,
        add_months(trunc(pdt_ref_date, 'Q'), -9) first_day_of_last_quarter_2,
        add_months(trunc(pdt_ref_date, 'Q'), -12) first_day_of_last_quarter_3,
        add_months(trunc(pdt_ref_date, 'Q'), -15) first_day_of_last_quarter_4,
        add_months(trunc(pdt_ref_date, 'Q'), -18) first_day_of_last_quarter_5
    FROM dual;

    RETURN pcr_result;
END;
/

Вызывающий блок

DECLARE
     m_curs                        SYS_REFCURSOR;
     TYPE pcr_rec IS RECORD ( 
     pdt_ref_date                  DATE,
     pdt_ref_date_1                DATE,
     pdt_ref_date_2                DATE,
     pdt_ref_date_3                DATE,
     pdt_ref_date_mon              DATE,
     first_day_of_last_month       DATE,
     first_day_of_2nd_last_month   DATE,
     first_day_of_3rd_last_month   DATE,
     first_day_of_last_quarter_1   DATE,
     first_day_of_last_quarter_2   DATE,
     first_day_of_last_quarter_3   DATE,
     first_day_of_last_quarter_4   DATE,
     first_day_of_last_quarter_5   DATE
 );
 pcr_res pcr_rec;
BEGIN
     m_curs := rep_dates(SYSDATE);--pass your pdt_ref_date
     FETCH m_curs INTO pcr_res;

     CALLMISUSER01.INSERT_DEP004(pcr_res.pdt_ref_date,pcr_res.pdt_ref_date_1,
      --..... --all other column aliases.
      pcr_res.first_day_of_last_quarter_5);

END;
/
...