У меня есть 2 столбца V_DATE И OTP .... ПОСЛЕ 24 ЧАСА V_DATE Я ХОЧУ УСТАНОВИТЬ ОТР. КОЛОННА = 0 - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 2 столбца: V_DATE и OTP.

Я хочу установить OTP = 0 через 24 часа после V_DATE.

1 Ответ

0 голосов
/ 10 мая 2018

Вот один из вариантов.

Пример таблицы содержит 3 строки с разными значениями даты (разделенные на несколько минут).

SQL> create table test
  2    (v_date date,
  3     otp    number,
  4     --
  5     otp_changed_on date);

Table created.

SQL> insert into test (v_date, otp) values (sysdate + 0 / (24 * 60), 100);

1 row created.

SQL> insert into test (v_date, otp) values (sysdate + 2 / (24 * 60), 200);

1 row created.

SQL> insert into test (v_date, otp) values (sysdate + 3 / (24 * 60), 300);

1 row created.

SQL> select * From test;

V_DATE                     OTP OTP_CHANGED_ON
------------------- ---------- -------------------
10.05.2018 14:49:27        100
10.05.2018 14:51:27        200
10.05.2018 14:52:27        300    

Процедура обновления OTP; Я добавил столбец OTP_CHANGED_ON, который показывает , когда это произошло.

SQL> create or replace procedure p_set_otp as
  2  begin
  3     -- "2 / (24 * 60)" is "1 minute later" (as I'm impatient).
  4     --  You'd use "WHERE SYSDATE >= v_date + 1", i.e. 1 day later
  5    update test set
  6      otp = 0,
  7      otp_changed_on = sysdate
  8      where sysdate >= v_date + 1 / (24 * 60)
  9        and otp <> 0;
 10  end;
 11  /

Procedure created.

Задание планируется запускать каждую минуту (я полагаю, что все в порядке, учитывая тот факт, что вы ищете "один день спустя". Требуется предоставить следующие привилегии: EXECUTE ON DBMS_SCHEDULER, CREATE РАБОТА.

SQL> begin
  2     dbms_scheduler.create_job (
  3        job_name          => 'update_otp',
  4        job_type          => 'PLSQL_BLOCK',
  5        job_action        => 'BEGIN p_set_otp; end;',
  6        start_date        => TO_DATE ('10.05.2018 14:30', 'DD.MM.YYYY HH24:MI'),
  7        repeat_interval   => 'FREQ=MINUTELY',
  8        enabled           => TRUE,
  9        comments          => 'Update OTP to 0');
 10  end;
 11  /

PL/SQL procedure successfully completed.

SQL>

Результат, через несколько минут:

SQL> select * From test;

V_DATE                     OTP OTP_CHANGED_ON
------------------- ---------- -------------------
10.05.2018 14:49:27          0 10.05.2018 14:51:00
10.05.2018 14:51:27          0 10.05.2018 14:53:00
10.05.2018 14:52:27        300

SQL>

Как я уже сказал: единственное изменение, которое вы должны сделать, это строка 8 в P_SET_PROCEDURE:

where sysdate >= v_date + 1
...