【发布时间】:2018-10-20 16:55:35
【问题描述】:
我有 2 列:V_DATE 和 OTP。
我想在V_DATE 24 小时后设置OTP = 0。
【问题讨论】:
-
请提供您尝试过的代码
-
尝试调度器及时执行并更新表
标签: sql oracle oracle11g oracle-apex
我有 2 列:V_DATE 和 OTP。
我想在V_DATE 24 小时后设置OTP = 0。
【问题讨论】:
标签: sql oracle oracle11g oracle-apex
这是一种选择。
一个示例表包含 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>
正如我所说:你应该做的唯一修改是在 P_SET_PROCEDURE 的第 8 行:
where sysdate >= v_date + 1
【讨论】: