Oracle 如何在PLSQL中循环遍历游标?

Oracle 如何在PLSQL中循环遍历游标?,oracle,plsql,Oracle,Plsql,我正在尝试用PL SQL获取前一个工作日。我不能100%确定我尝试的方法是否正确 基本上我们有一个假日表,我试图在假日表中循环输入日期,然后返回前一个工作日。我使用光标获取假日列表,然后使用while循环。我遇到的问题是代码运行,但光标只返回假日列表中的最后一个值 Create or Replace Function GetPreviousWorkingDay ( CurrentDate in Date ) Return Date As PreviousW

我正在尝试用PL SQL获取前一个工作日。我不能100%确定我尝试的方法是否正确

基本上我们有一个假日表,我试图在假日表中循环输入日期,然后返回前一个工作日。我使用光标获取假日列表,然后使用
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中使用这些结构