Я пытаюсь превратить выделение в функцию в жабе / Oracle - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь превратить этот выбор в функцию. Вместо sysdate пользователь даст свою собственную дату, которую он хотел видеть. (Извините за плохой английский).

SELECT  trunc(sysdate),
        trunc(sysdate) - 1,
        trunc(sysdate) - 2,
        trunc(sysdate) - 3,
        trunc(last_day(sysdate)-1, 'mm'),       
        add_months(trunc(sysdate, 'MM'), -1) first_day_of_last_month,
        add_months(trunc(sysdate, 'MM'), -2) first_day_of_last_month,
        add_months(trunc(sysdate, 'MM'), -3) first_day_of_last_month,
        add_months(trunc(sysdate, 'Q'), -6) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -9) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -12) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -15) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -18) first_day_of_last_quarter
FROM dual;

Результат должен выглядеть примерно так: 1 строка

1/7/2019    1/6/2019    1/5/2019    1/4/2019    1/1/2019    12/1/2018   11/1/2018   10/1/2018   7/1/2018    4/1/2018    1/1/2018    10/1/2017   7/1/2017

1 Ответ

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

Вы можете создать функцию, возвращающую курсор ref.

CREATE FUNCTION get_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(last_day(pdt_ref_date)-1, '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;

Который можно использовать следующим образом:

SELECT get_dates(SYSDATE)
FROM DUAL;

Обратите внимание, что:

  • Я не знаю назначение этой функции, поэтому я ее в общем назвал get_dates
  • Вам может потребоваться определить эту функцию в пакете, особенно если у вас есть несколько связанных функций / procs
...