如何在PLSQL中遍历游标?

时间:2018-12-31 07:01:28

标签: oracle plsql

我试图在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; 

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:3)

只有在查询中指定holiday_table时,使用CURSOR循环遍历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;
/

Demo

注意:我们可以使用SQL查询轻松获得上一个工作日,而无需PL / SQL。您可以参考答案 here 。我使用循环和游标回答了这个问题,因为我想您可能出于学习的目的在PL / SQL中使用了这些构造。