首页 > 解决方案 > PLSQL 是否可以在某个日期更新表列?

问题描述

我有这张桌子:

penalities(player,dateofpenality,penalityDays,status)

根据某些标准,玩家被添加到此表中,状态变为“是”。我希望他的状态在惩罚期(=penalityDays)结束后改为“否”。

我想到了一个日期触发器,但我在 plsql 中找不到它。请注意,我不想删除播放器,因为我需要历史。

标签: plsql

解决方案


做到这一点的唯一方法是安排一个每天启动一次的后台作业。

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

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 文档,但我认为Oracle-Base 文章是一个更友好的起点。


推荐阅读