PLSQL是否可以在特定日期更新表列?

时间:2019-04-21 10:04:52

标签: plsql

我有这张桌子:

penalities(player,dateofpenality,penalityDays,status)

根据某些条件,玩家会添加到此表中,状态为“是”。我希望他的身份在刑期(= penalityDays)消失后更改为“否”。

我想到了日期触发器,但在plsql中找不到它。 请注意,由于我需要历史记录,因此我不想删除播放器。

1 个答案:

答案 0 :(得分:1)

唯一的方法是安排每天开始一次的后台作业。

编写一个简单的存储过程以应用状态更改:

create or replace procedure update_penalty_status as
begin

    update penalties
    set status = 'no'
    where sysdate >= dateofpenality + penalityDays
    and status = 'yes';

    commit;

end update_penalty_status;

然后提交作业,每天运行一次。它使用的是DBMS_SCHEDULER(自10g起可用),而不是旧的DBMS_JOB。

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
       job_name             => 'your_schema.my_job1',
       job_type             => 'PLSQL_BLOCK',
       job_action           => 'BEGIN update_penalty_status; END;',
       start_date           => trunc(sysdate)+1,
       repeat_interval      => 'FREQ=DAILY'
       enabled              =>  TRUE,
       comments             => 'Revoke expired penalties');
END;
/

请注意,您将需要CREATE JOB权限才能执行此操作。您可能需要向DBA寻求帮助和指导。通常,我现在会链接到Oracle文档,但是我认为the Oracle-Base article是一个更友好的起点。