Конспект лекций по дисциплине «Сетевые базы данных», страница 22

BEGIN

select to_char(sysdate,’hh24’) into H from dual;

if (H>=8 AND H<=17) then

update my_tab set timesave=sysdate;

end if;

END;

/

В этом примере командой select считывается текущий час из системной даты sysdate в переменную H. Обратите внимание, что в данной команде select используется виртуальная таблица DUAL. В Oracle всегда доступна эта таблица, которая возвращает только одну строку, а в качестве возвращаемых значений будут получены в результаты вычисления всех выражений и функций, которые присутствуют в списке вывода после ключевого слова select. Форма используемой здесь команды select (с фразой into) рассматривается в параграфе 8. Затем, используя оператор IF, проверяется, попадет ли текущий час в рабочее время. Если это так, то в поле timesave таблицы my_tab записывается текущие дата и время. Если же программа выполняется в нерабочее время (т.е. условие не выполняется), то никаких изменений в базе данных происходит.

DECLARE

H number;

BEGIN

select to_char(sysdate,’hh24’) into H from dual;

if (H>=8 AND H<=12) then

update my_tab set priznak=1;

elsif (H>=13 AND H<=17) then

update my_tab set priznak=2;

else

update my_tab set priznak=null;

end if;

END;

/

В этом примере в переменную H также считывается текущий час. Если его значение попадает в предобеденное рабочее время, то в поле priznak записывается 1. Если значение попадает в послеобеденное рабочее время, то в поле priznak записывается 2. Если выполнение программы происходит в нерабочее время, то в поле priznak записывается пустое значение – null.

            7.4. Оператор выбора CASE

Оператор CASE является еще одной конструкцией языка PL/SQL для выполнения условных вычислений по типу «развилка». PL/SQL предлагает два варианта оператора CASE для управления условными вычислениями. Первый вариант имеет следующий синтаксис

CASE выражение

WHEN значение1 THEN действия;

WHEN значение2 THEN действия;

ELSE действия;

END CASE;

Здесь выражение и значениеN  – любые выражения, которое поочередно сравнивается на равенство. Если  выражение равно значению1, то выполняются действия, указанные после соответствующей фразы THEN, после чего выполнение оператора CASE завершается. В противном случае проверяется, равно ли выражение и значение2, и так далее пока не будут обнаружено равенство выражения и одного из значений. Однако если этого не произойдет ни с одним из значений, то будут выполнены действия, определяемые во фразе ELSE.

Пример.

DECLARE

N number;

BEGIN

H := Last_day(sysdate);

CASE N

WHEN 28 THEN

update my_tab set priznak=1;

WHEN 29 THEN

update my_tab set priznak=1;

WHEN 30 THEN

update my_tab set priznak=2;

ELSE

update my_tab set priznak=3;

END CASE;

END;

/

В примере сначала переменной N присваивается число дней в текущем месяце (применяется функция Last_day к системной дате) . Затем проверяется, если число дней в текущем месяце равно 28 или 29, то текущий месяц – февраль, и  в таблицу записывается признак 1. На этом оператор CASE завершается. Если текущий месяц не февраль, то проверяется – является ли текущий месяц месяцем, в котором 30 дней. Если да, то признаку присваивается 2. Если все выполненные проверки не дали результата, то значит текущий месяц имеет 31 день, и признаку присваивается значение 3.

Второй вариант оператора CASE имеет синтаксис

CASE

WHEN выражение1 THEN действия;

WHEN выражение2 THEN действия;

ELSE действия;

END CASE;