【问题标题】:pipelined function with if statement带有 if 语句的流水线函数
【发布时间】:2021-10-15 10:53:59
【问题描述】:

我想创建一个函数来检索每条记录的有效年份。我在表中有 valid_fromvalid_to 列。

例如valid_from = 2018-04-30valid_to = 2020-06-30;函数应该产生三个值:201820192020

我创建了一个类型和一个函数,但它根本不起作用......

create or replace type t_years is table of varchar2(4);

create or replace function func_year(d_from date, d_to date) return t_years pipelined
is
v_date date := '21/12/31 00:00:00';
max_date date := '99/12/30 00:00:00';
begin
 for x in 1..2 loop
 if    d_from <= add_months(v_date,-1*12) AND (add_months(d_to,-1*12) >= v_date OR add_months(d_to,-1*12) = max_date) then return '2020';
    elsif d_from <= add_months(v_date,-2*12) AND (add_months(d_to,-2*12) >= v_date OR add_months(d_to,-2*12) = max_date) then return '2019';
    end if;
    pipe row(x);
 end loop;
 return;
end;

【问题讨论】:

    标签: oracle function plsql


    【解决方案1】:

    方法如下:

    SQL> CREATE OR REPLACE TYPE t_years IS TABLE OF VARCHAR2 (4);
      2  /
    
    Type created.
    
    SQL> CREATE OR REPLACE FUNCTION func_year (d_from IN DATE, d_to IN DATE)
      2     RETURN t_years
      3     PIPELINED
      4  IS
      5  BEGIN
      6     FOR i IN EXTRACT (YEAR FROM d_from) .. EXTRACT (YEAR FROM d_to)
      7     LOOP
      8        PIPE ROW (i);
      9     END LOOP;
     10
     11     RETURN;
     12  END;
     13  /
    
    Function created.
    
    SQL> SELECT func_year (DATE '2019-01-01', DATE '2021-01-01') FROM DUAL;
    
    FUNC_YEAR(DATE'2019-01-01',DATE'2021-01-01')
    ----------------------------------------------------------------------------------------------------
    T_YEARS('2019', '2020', '2021')
    
    SQL>
    

    或者

    SQL> SELECT * FROM TABLE (func_year (DATE '2019-01-01', DATE '2021-01-01'));
    
    COLU
    ----
    2019
    2020
    2021
    
    SQL>
    

    【讨论】:

    • 完美运行!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多