基于sysdate的事件

Akk*_*kki 5 sql database oracle triggers plsql

可能重复:
基于sysdate的触发器

1.我有一张表,每天必须在12:00(24小时格式)执行更新操作.

我该怎么做到这一点?

表格架构:

CREATE TABLE CHARGES   
(
    total NUMBER(30),
    admitdate TIMESTAMP(6),
    dischargedate TIMESTAMP(30)
)
Run Code Online (Sandbox Code Playgroud)

更新算法:

if 
{
   dischargedate="null" 
   then total=admitdate-sysdate=difference in days * Total
   Do this every day at 12:00(24 Hr. Format)
}
else
{  
  do nothing.    
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 1

每 24 小时运行一次作业的标准是使用系统包在此时间间隔运行一次作业DBMS_SCHEDULER

例如:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'update_charges',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN my_procedure; END;',
    start_date      => TRUNC(SYSDATE) + 0.5,
    repeat_interval => 'freq=daily;',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Update the discharged date in charges.');
END;
/
Run Code Online (Sandbox Code Playgroud)

然后您创建一个要运行的过程:

create or replace PROCEDURE my_procedure is

begin

  update charges
     set total = admitdate - sysdate
   where dischargedate is null;

end;
/
Run Code Online (Sandbox Code Playgroud)

这会将列总计更新为 和 SYSDATE 之间的天数admitdate

然而,我质疑是否有必要这样做。这听起来很像古老的“我应该存储年龄”问题吗?我相信答案是否定的。在某些时候您绝对肯定会出错,并且有多种可能性可能会导致作业手动运行不正确。当您从数据库中提取数据时,我会即时计算此列。