–1、建立table类型
create or replace type dateArrayType as table of nvarchar2(40);
/
–2、创建一个object类型
create or replace type map_date_object as object
(
c_monday varchar2(50),
c_tuesday varchar2(50),
c_wednesday varchar2(50),
c_thursday varchar2(100),
c_friday varchar2(100),
c_date1 date,
c_date2 date,
c_date3 date,
c_date4 date,
c_date5 date
);
/
–3、构建t_map_object类型
create or replace type tb_map_date_object as table of map_date_object;
/
–4、构建返回多字段管道函数
/*description:根据用户输入的日期,展示当前日期的所在星期的工作日/
create or replace function getWorkDateList(v_date in date) return
tb_map_date_object
PIPELINED --声明管道函数
is
v_data tb_map_date_object := tb_map_date_object();
--初始化日期
v_date1 date := v_date;
v_date2 date := v_date+1;
v_date3 date := v_date+2;
v_date4 date := v_date+3;
v_date5 date := v_date+4;
c_monday varchar2(10) := '星期一';
c_tuesday varchar2(10) := '星期二';
c_wednesday varchar2(10) := '星期三';
c_thursday varchar2(10) := '星期四';
c_friday varchar2(10) := '星期五';
begin
--如果v_date1是星期二
if(checkHoliday(v_date)='3') then
v_date1 := v_date-1;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期三
elsif(checkHoliday(v_date)='4') then
v_date1 := v_date-2;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期四
elsif(checkHoliday(v_date)='5') then
v_date1 := v_date-3;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期五
elsif(checkHoliday(v_date)='6') then
v_date1 := v_date-4;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期六
elsif(checkHoliday(v_date)='7') then
v_date1 := v_date+2;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期天
elsif(checkHoliday(v_date)='1') then
v_date1 := v_date+1;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
--如果v_date1是星期一
elsif(checkHoliday(v_date)='2') then
v_date1 := v_date;
v_date2 := v_date1+1;
v_date3 := v_date2+1;
v_date4 := v_date3+1;
v_date5 := v_date4+1;
end if;
for x in(
select c_monday as v_1,c_tuesday as v_2,c_wednesday as v_3,c_thursday as v_4,c_friday as v_5,v_date1 as v_6,v_date2 as v_7,v_date3 as v_8,v_date4 as v_9,v_date5 as v_10 from dual
)loop
v_data.extend();
PIPE ROW(map_date_object(x.v_1,x.v_2,x.v_3,x.v_4,x.v_5,x.v_6,x.v_7,x.v_8,x.v_9,x.v_10));
end loop;
return;
end;
/
–5、将当期星期转化为数字(例如:星期天为数字7)
create or replace function checkHoliday(v_date in date) return varchar2
is
c_date varchar2(20) :=to_char(v_date,'d');
v_result varchar2(20) :=c_date;
begin
return v_result;
end checkHoliday;
/
–6、调用:
select * from table(getWorkDateList(sysdate+5));
/**output:
1 星期一 星期二 星期三 星期四 星期五 2018/9/10 星期一 下午 8:23:29 2018/9/11 星期二 下午 8:23:29 2018/9/12 星期三 下午 8:23:29 2018/9/13 星期四 下午 8:23:29 2018/9/14 星期五 下午 8:23:29
**/