【问题标题】:I have 2 columns V_DATE AND OTP.... AFTER 24 HOUR OF V_DATE I WANT TO SET OTP COLUMN =0我有 2 列 V_DATE 和 OTP.... V_DATE 24 小时后我想设置 OTP 列 =0
【发布时间】:2018-10-20 16:55:35
【问题描述】:

我有 2 列:V_DATEOTP

我想在V_DATE 24 小时后设置OTP = 0

【问题讨论】:

  • 请提供您尝试过的代码
  • 尝试调度器及时执行并更新表

标签: sql oracle oracle11g oracle-apex


【解决方案1】:

这是一种选择。

一个示例表包含 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 2023-02-26
    • 2022-08-16
    • 2014-10-18
    • 2022-01-24
    • 1970-01-01
    • 2020-10-04
    • 2020-12-16
    相关资源
    最近更新 更多