在plsql中获取结果集

时间:2015-04-01 12:00:18

标签: plsql

我想知道是否已经有一些重写建议来获取函数,例如在两个日期之间生成重复日期 - 来自此链接的generate_recurrences()用于重现recurrency events

在plsql中

?它返回一个setof日期,但是在plsql中我无法弄清楚如何获取日期的结果集并循环返回next next_date,其中next也返回列表上的下一个日期。

我尝试在plsql中重写它但只返回一个日期,因为我无法找到如何在plsql中返回结果集,这是我尝试过的:

CREATE OR REPLACE FUNCTION GENERATE_RECURRENCE( rec in VARCHAR2,
                                start_date in TIMESTAMP,
                                end_date in TIMESTAMP )
RETURN  TIMESTAMP
IS
    next_date TIMESTAMP := start_date;
    duration  INTERVAL  DAY TO SECOND;
    day       INTERVAL  DAY TO SECOND;
BEGIN
 IF recurs = 'none' THEN
    return next_date;
 elsif recurs = 'daily' then
    duration :=  INTERVAL '1' DAY ;
    while next_date <= end_date loop
     return next_date + duration;
END IF;
END;

1 个答案:

答案 0 :(得分:1)

我刚才写了下面的流水线功能。它并不是完全您要求的内容,但它会为您提供一系列日期的结果集,因此您应该能够将其与您的需求相匹配。

它要求您创建一个类型对象来保存返回值,并使用现有对象而不是创建自定义对象。所以你应该修改它以使用足够大的对象(并使用日期类型而不是字符串)。但功能可以满足您的要求。

享受!

CREATE OR REPLACE FUNCTION date_range_stream(start_date_in IN DATE,
                                             end_date_in   IN DATE) RETURN rpt_results_10_obj_type_type
    DETERMINISTIC
    PIPELINED IS
    /* 
        Parameters:     start_date_in - First date to return (truncated)
                        end_date_in   - Last date to return, inclusive

        Results:        date string formatted as MM/DD/YYYY

        Author:         Stew Stryker

        Usage:          SELECT to_date(text01, 'MM/DD/YYYY') AS a_date
                          FROM TABLE(aeo.aeo_misc_tools.date_range_stream('01-MAR-2009', SYSDATE))
                        Returns a rows from starting date to current

        Requires the definition of the following object:

            CREATE OR REPLACE TYPE rpt_results_10col_obj AS OBJECT
            (   seq_num NUMBER,
                place VARCHAR2(20),
                rep_info VARCHAR2(20),
                text01 VARCHAR2(512),
                text02 VARCHAR2(512),
                text03 VARCHAR2(512),
                text04 VARCHAR2(512),
                text05 VARCHAR2(512),
                text06 VARCHAR2(512),
                text07 VARCHAR2(512),
                text08 VARCHAR2(512),
                text09 VARCHAR2(512),
                text10 VARCHAR2(512));


    */
    cur_date DATE := trunc(start_date_in);
    date_row rpt_results_10col_obj := aeo.rpt_results_10col_obj(NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                NULL);
BEGIN
    WHILE cur_date <= trunc(end_date_in)
    LOOP
        date_row.text01 := TO_CHAR(cur_date, 'MM/DD/YYYY');
        PIPE ROW(date_row);
        cur_date := cur_date + 1;
    END LOOP;

    RETURN;

EXCEPTION
    WHEN no_data_found THEN
        RETURN;
    WHEN OTHERS THEN
        dbms_output.put_line('EXCEPTION IN aeo.aeo_misc_tools.date_range_stream - ' || SQLCODE || ': ' ||
                             SQLERRM);
        RAISE;
        RETURN;
END date_range_stream;