【问题标题】:tricky plsql procedure to delete data删除数据的棘手 plsql 程序
【发布时间】:2013-07-25 16:56:46
【问题描述】:

朋友和 pl/sql 大师...

我正在尝试创建从审计表中删除数据的过程,但不知道从哪里开始..

如果有人可以提供一些提示或指针,那就太好了......

要求:

  1. 程序将在每月的第一个星期六运行(不确定是否可以通过 pl/sql 或必须创建单独的作业)

  2. 从周一到周六删除超过 2 个月的数据,日期不应为当月 1 日。 (即离开星期日和每月 1 日的数据超过 2 个月)

例如

*Procedure delete_log

IS

BEGIN


delete from audit_logs
where created >= trunc(sysdate - 60) and created < trunc(sysdate)
and created != (Sunday)
and created != (First of the month);

Commit;

End delete_log;*

我对 pl/sql 没有太多经验,所以所有提示都值得赞赏..

谢谢, 迈克

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    要安排作业,您可以使用服务器级别的 cron 作业或 Oracle Scheduler 来运行任务http://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse002.htm#i1006395

    这样的事情会起作用:

    CREATE OR REPLACE PROCEDURE delete_log
    IS
    BEGIN
       DELETE FROM audit_logs
             WHERE     TRUNC (created) < ADD_MONTHS (TRUNC (SYSDATE), -2)
                   AND TO_CHAR (TRUNC (created), 'DY') != 'SUN'
                   AND TO_CHAR (TRUNC (created), 'DD') != '01';
    END;
    /
    

    【讨论】:

    • 谢谢...我会对此进行测试并告诉您...只是想知道我们可以使用相同的语法使用 to_char 和 trunc 吗?
    • 是的,这是有效的语法。
    【解决方案2】:

    DBMS_Scheduler 日历语法将支持在每月的第一个星期六运行进程。

    语法类似于:

    'FREQ=MONTHLY; BYDAY=SAT; BYSETPOS=1'
    

    您需要为您希望它运行的确切时间添加子句。

    'FREQ=MONTHLY; BYDAY=SAT; BYHOUR=3; BYMINUTE=30; BYSECOND = 0; BYSETPOS=1'
    

    就删除而言:

    delete from audit_logs
    where created                   <  add_months(trunc(sysdate,'MM'),-2)   and
          to_char(created,'DY')     != 'SUN'                                and
          extract(DAY from created) != 1;
    

    【讨论】:

    • 啊,因为无论如何都要排除每月的第一天;)
    • 所以@verbanicm 提供的答案可以吗?还是需要 +1?
    • verbanicim 的代码删除了两个月前的记录,根据您的伪代码,这似乎不是您所要求的。创建时的 TRUNC() 也是多余的。
    • 谢谢大卫..我的代码语法不准确,但规定的要求是正确的......需要删除所有超过 2 个月的记录(留下 Sun 和 01 数据)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多