Как мне перебрать курсор в PLSQL? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь получить предыдущий рабочий день в 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 голосов
/ 31 декабря 2018

Ваша логика обхода 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.Вы можете отсылать ответы здесь .Я ответил на это с помощью циклов и курсоров, потому что я предполагаю, что вы, вероятно, используете эти конструкции в PL / SQL для обучения цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...