创建返回结果集的函数

–定义一个行类型(参数为结果集的字段)
CREATE OR REPLACE TYPE FHC_JW.TYPE_TTEMP_ROW AS OBJECT(STARTDATE VARCHAR2(20),ENDDATE VARCHAR2(20), WEEKNO VARCHAR2(20));

–定义一个表类型
CREATE OR REPLACE TYPE FHC_JW.TYPE_TEMP_TABLE AS TABLE OF FHC_JW.TYPE_TTEMP_ROW;

–创建函数
CREATE OR REPLACE FUNCTION FHC_JW.FUN_GETWEEKDATE (STARTDATEPARAM IN VARCHAR2,ENDDATEPARAM IN VARCHAR2)
RETURN TYPE_TEMP_TABLE IS
TEMP_ROW TYPE_TTEMP_ROW; – 定义单行
TEMP_TABLE TYPE_TEMP_TABLE := TYPE_TEMP_TABLE(); – 定义返回结果,并初始化
BEGIN
FOR CURROW IN (
–查询结果集sql–开始–(返回的字段为TYPE_TTEMP_ROW中的参数的字段)
with temp as(SELECT count(*) totalNum
FROM DUAL
CONNECT BY ROWNUM <=
round(TRUNC(to_DATE(ENDDATEPARAM, ‘YYYY-MM-DD’) -
to_DATE(STARTDATEPARAM, ‘YYYY-MM-DD’)) / 7 + 1
))
select
(case when rownum=1 and startDate<TRUNC(to_DATE(STARTDATEPARAM, ‘YYYY-MM-DD’))
then to_CHAR(STARTDATEPARAM, ‘YYYY-MM-DD’)
else to_CHAR(startDate, ‘YYYY-MM-DD’)
end
)STARTDATE,
(case when rownum=temp.totalNum and endDate>TRUNC(to_DATE(ENDDATEPARAM, ‘YYYY-MM-DD’))
then to_CHAR(ENDDATEPARAM, ‘YYYY-MM-DD’)
else to_CHAR(endDate, ‘YYYY-MM-DD’)
end
)ENDDATE,‘第’||rownum||‘周’ WEEKNO
from(
SELECT TRUNC(to_DATE(STARTDATEPARAM, ‘YYYY-MM-DD’) + (ROWNUM - 1) * 7, ‘D’) + 1 AS startDate,
TRUNC(to_DATE(STARTDATEPARAM, ‘YYYY-MM-DD’) + (ROWNUM - 1) * 7, ‘D’) + 7 AS endDate
FROM DUAL
CONNECT BY ROWNUM <=
round(TRUNC(to_DATE(ENDDATEPARAM, ‘YYYY-MM-DD’) -
to_DATE(STARTDATEPARAM, ‘YYYY-MM-DD’)) / 7 + 1)
),temp
–查询结果集sql–结束–
) – 查询名字是参数的值的结果
LOOP
TEMP_ROW := TYPE_TTEMP_ROW(CURROW.STARTDATE, CURROW.ENDDATE,CURROW.WEEKNO); – 获得一行
TEMP_TABLE.EXTEND; – 表类型增加一行(EXTEND就是扩展的意思,相当于增加一行数据空间)
TEMP_TABLE(TEMP_TABLE.COUNT) := TEMP_ROW; – 一行放进去
END LOOP;
RETURN(TEMP_TABLE);
END;

–执行函数
SELECT * FROM TABLE(FHC_JW.FUN_GETWEEKDATE(‘2022-09-01’,‘2023-03-01’));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值