Oracle 如何在PLSQL中循环遍历游标?
我正在尝试用PL SQL获取前一个工作日。我不能100%确定我尝试的方法是否正确 基本上我们有一个假日表,我试图在假日表中循环输入日期,然后返回前一个工作日。我使用光标获取假日列表,然后使用Oracle 如何在PLSQL中循环遍历游标?,oracle,plsql,Oracle,Plsql,我正在尝试用PL SQL获取前一个工作日。我不能100%确定我尝试的方法是否正确 基本上我们有一个假日表,我试图在假日表中循环输入日期,然后返回前一个工作日。我使用光标获取假日列表,然后使用while循环。我遇到的问题是代码运行,但光标只返回假日列表中的最后一个值 Create or Replace Function GetPreviousWorkingDay ( CurrentDate in Date ) Return Date As PreviousW
while
循环。我遇到的问题是代码运行,但光标只返回假日列表中的最后一个值
Create or Replace Function GetPreviousWorkingDay
(
CurrentDate in Date
)
Return Date
As
PreviousWorkingDay Date;
Cursor dt_cursor is
Select holiday_date
from holiday_table;
HolidayDate date;
Begin
PreviousWorkingDay := CurrentDate;
Open dt_cursor;
Loop
Fetch dt_cursor into HolidayDate;
Exit When dt_cursor%NOTFOUND;
End Loop;
While PreviousWorkingDay = HolidayDate
Loop
PreviousWorkingDay := PreviousWorkingDay - 1;
Exit When PreviousWorkingDay <> HolidayDate;
End Loop;
Close dt_cursor;
Return previousworkingday;
END;
创建或替换函数GetPreviousWorkingDay
(
日期中的当前日期
)
返回日期
作为
上一个工作日日期;
光标dt_光标为
选择假日日期
从假日桌;
假期日期;
开始
上一个工作日:=当前日期;
打开dt_光标;
环
将dt_光标提取到HolidayDate中;
未找到dt_光标%时退出;
端环;
而上一个工作日=度假日
环
PreviousWorkingDay:=PreviousWorkingDay-1;
在上一个工作日假期日期时退出;
端环;
关闭dt_光标;
返回上一个工作日;
结束;
任何帮助都将不胜感激。谢谢仅当您在查询中指定一个
ORDER BY
时,使用光标
循环遍历假日表
的逻辑才有效
CREATE OR REPLACE FUNCTION getpreviousworkingday (
currentdate IN DATE
) RETURN DATE AS
previousworkingday DATE := currentdate - 1; -- start from previous day
l_holiday DATE;
CURSOR dt_cursor IS SELECT holiday_date
FROM holiday_table
WHERE holiday_date < currentdate
ORDER BY holiday_table DESC;--start with recent holiday before
--currentdate & keep compare backwards.
BEGIN
OPEN dt_cursor;
LOOP
FETCH dt_cursor INTO l_holiday;
EXIT WHEN dt_cursor%notfound OR previousworkingday <> l_holiday;
previousworkingday := previousworkingday - 1;
END LOOP;
RETURN previousworkingday;
END;
/
创建或替换函数getpreviousworkingday(
日期中的当前日期
)返回日期为
上一个工作日日期:=当前日期-1;--从前一天开始
假期日期;
光标dt_光标是选择假日日期
从度假桌
其中假日日期<当前日期
按假日表说明订购--从最近的假期开始
--currentdate&向后比较。
开始
打开dt_光标;
环
将dt_光标移到l_假日中;
未找到dt_光标%或上一个工作日l_假期时退出;
previousworkingday:=previousworkingday-1;
端环;
返回上一个工作日;
结束;
/
注意:我们可以很容易地使用SQL查询获得前一个工作日,而无需PL/SQL。您可以参考答案。我使用循环和游标来回答这个问题,因为我认为您可能正在使用PL/SQL中的这些结构来进行学习工作。只有在查询中指定
ORDER BY
时,才可以使用游标
循环遍历假日表的逻辑
CREATE OR REPLACE FUNCTION getpreviousworkingday (
currentdate IN DATE
) RETURN DATE AS
previousworkingday DATE := currentdate - 1; -- start from previous day
l_holiday DATE;
CURSOR dt_cursor IS SELECT holiday_date
FROM holiday_table
WHERE holiday_date < currentdate
ORDER BY holiday_table DESC;--start with recent holiday before
--currentdate & keep compare backwards.
BEGIN
OPEN dt_cursor;
LOOP
FETCH dt_cursor INTO l_holiday;
EXIT WHEN dt_cursor%notfound OR previousworkingday <> l_holiday;
previousworkingday := previousworkingday - 1;
END LOOP;
RETURN previousworkingday;
END;
/
创建或替换函数getpreviousworkingday(
日期中的当前日期
)返回日期为
上一个工作日日期:=当前日期-1;--从前一天开始
假期日期;
光标dt_光标是选择假日日期
从度假桌
其中假日日期<当前日期
按假日表说明订购--从最近的假期开始
--currentdate&向后比较。
开始
打开dt_光标;
环
将dt_光标移到l_假日中;
未找到dt_光标%或上一个工作日l_假期时退出;
previousworkingday:=previousworkingday-1;
端环;
返回上一个工作日;
结束;
/
注意:我们可以很容易地使用SQL查询获得前一个工作日,而无需PL/SQL。您可以参考答案。我使用循环和游标来回答这个问题,因为我认为您可能是为了学习而在PL/SQL中使用这些结构