2015-04-01 44 views
0

設置想知道是否有已經有一些改寫建議,幫助功能,生成日期復發兩個日期之間 - 從這個鏈接generate_recurrences()用於復發的recurrency events獲取引起PLSQL

在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

我前段時間寫了下面的流水線函數。這不是正是你要求的,但它給了你一個日期範圍的結果集,所以你應該能夠匹配你的需求。

它需要你創建一個類型對象來保存返回值,我使用了一個現有的對象而不是創建一個自定義的對象。所以你應該修改它來使用足夠大的對象(並且使用日期類型而不是字符串)。但功能不會滿足你的要求。

享受!

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; 
+0

非常感謝你我會嘗試一下。 – Kaly 2015-04-07 07:29:17

+0

如果您覺得這有用,我可以使用一些聲望點。提示提示。 – StewS2 2015-04-08 12:04:48

+0

感謝它幫助我的問題 – Kaly 2015-04-08 13:47:45