Вот один из вариантов.
Пример таблицы содержит 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