首页 > 解决方案 > 我正在尝试将选择转变为 Toad/Oracle 中的功能

问题描述

我正在尝试将这个选择变成功能。而不是 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 Row 中看起来像这样

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

标签: sqloracleplsqlstored-functions

解决方案


您可以构建一个返回引用光标的函数。

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

推荐阅读