在plsql中获取结果集
Get result set in plsql
我想知道是否已经有一些重写建议来获取函数,例如在两个日期之间生成重复日期 - 来自此 link 的 generate_recurrences() 用于重复 recurrency events
在 plsql 中?它 return 是一组日期,但在 plsql 中我无法弄清楚如何获取日期的结果集并循环 return 下一个 next_date,其中下一个也是 return 下一个列表上的日期。
我尝试在 plsql 中重写它,但只有一个日期 return,因为我无法找到如何在 plsql 中 return 结果集,这就是我尝试过的:
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;
我刚才写了下面的流水线函数。这并不完全您所要求的,但它为您提供了一个日期范围内的结果集,因此您应该能够将其与您的需要相匹配。
它要求您创建一个类型对象来保存 return 值,我使用了现有对象而不是创建自定义对象。所以你应该修改它以使用一个足够大的对象(并使用日期类型而不是字符串)。但该功能可以满足您的要求。
尽情享受吧!
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;
我想知道是否已经有一些重写建议来获取函数,例如在两个日期之间生成重复日期 - 来自此 link 的 generate_recurrences() 用于重复 recurrency events
在 plsql 中?它 return 是一组日期,但在 plsql 中我无法弄清楚如何获取日期的结果集并循环 return 下一个 next_date,其中下一个也是 return 下一个列表上的日期。
我尝试在 plsql 中重写它,但只有一个日期 return,因为我无法找到如何在 plsql 中 return 结果集,这就是我尝试过的:
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;
我刚才写了下面的流水线函数。这并不完全您所要求的,但它为您提供了一个日期范围内的结果集,因此您应该能够将其与您的需要相匹配。
它要求您创建一个类型对象来保存 return 值,我使用了现有对象而不是创建自定义对象。所以你应该修改它以使用一个足够大的对象(并使用日期类型而不是字符串)。但该功能可以满足您的要求。
尽情享受吧!
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;