【问题标题】:Oracle stored procedure that can auto remove records after 24 hours可以在 24 小时后自动删除记录的 Oracle 存储过程
【发布时间】:2021-08-30 23:25:37
【问题描述】:

程序能否在 24 小时后自动触发并从特定表中删除记录?

我试过了,但作为初学者我做不到。

这是我的代码:

CREATE OR REPLACE PROCEDURE deleteresetlinks ("2" INT)
AS BEGIN  
    DELETE FROM passwordresetlink 
    WHERE DATEDIFF(DAY, 'date_created', GETDATE()) > 2;
END;

这段代码抛出了这个错误:

SQL> 显示错误
PROCEDURE DELETERESETLINKS 的错误:

行/列错误

3/3 PL/SQL:忽略 SQL 语句
3/39 PL/SQL:ORA-00904:“DATEDIFF”:
无效的标识符

【问题讨论】:

  • @ik_zelf 是 essbase 文档。我怀疑这就是 OP 正在使用的

标签: sql oracle stored-procedures plsql procedure


【解决方案1】:

文档是一个很好的起点。 Oracle 有自己的数据类型和运算符,你不能只是从其他编程语言或数据库中借用它们并希望它能够工作。 DATEDIFF 是一个 mysql 函数,它在 oracle 中不存在。 我认为您正在寻找这样的东西:

CREATE OR REPLACE PROCEDURE deleteresetlinks (age_i IN NUMBER DEFAULT 1)
AS BEGIN  
  DELETE FROM passwordresetlink WHERE date_created < SYSDATE - age_i;
END;

在您原来的情况下,参数声明 ("2" INT) 创建了一个名称为“2”的参数 - 这非常令人困惑,可能不是您想要的。我将其替换为更具描述性的名称“age_i”——使用后缀“_i”表示它是一个 IN 参数。 我假设“date_create”列的类型是日期,在这种情况下,您可以使用简单的日期算术来计算天差。 SYSDATE - 1 代表 24 小时前。

【讨论】:

  • 能否请您重读您的最后一句话?
  • @Littlefoot 谢谢!更新了它。需要咖啡。现在:)
  • 没问题 :) 我也来一个!
【解决方案2】:

这就是我对问题的理解。

样本数据:

SQL> select * from passwordresetlink
  2  order by date_created;

        ID DATE_CREATED
---------- ---------------
         1 10.06.2021
         2 14.06.2021

程序应该删除超过 2 天的行;现在,可以对其进行修改,使其包含 time 组件,或者 - 就像在我的示例中一样 - 将其设置为 midnight,但这并不重要。

SQL> create or replace procedure p_del_resetlink
  2  is
  3  begin
  4     delete from passwordresetlink
  5       where date_created < trunc (sysdate) - 2;
  6  end;
  7  /

Procedure created.

这就是您的问题的答案,即如何“自动触发”该程序。创建数据库作业。我在 11g 上,这是 DBMS_JOB 示例,因为任务非常简单 - 每天运行一次该过程。我将它设置为凌晨 3 点(所以是的,这是夜间工作)。考虑改用DBMS_SCHEDULER

SQL> set serveroutput on
SQL> declare
  2     newjobid  number;
  3  begin
  4     sys.dbms_job.submit (
  5        job        => newjobid,
  6        what       => 'p_del_resetlink;',
  7        next_date  => to_date ('16.06.2021 03:00:00', 'DD.MM.YYYY HH24:MI:SS'),
  8        interval   => 'TRUNC(SYSDATE + 1) + 3/24',
  9        no_parse   => false);
 10     sys.dbms_output.put_line ('Job Number is: ' || to_char (newjobid));
 11     commit;
 12  end;
 13  /
Job Number is: 2983310

PL/SQL procedure successfully completed.
   

好的,让我们手动运行它:

SQL> exec dbms_job.run(2983310);

PL/SQL procedure successfully completed.

SQL> select * from passwordresetlink;

        ID DATE_CREATED
---------- ---------------
         2 14.06.2021

SQL>

看起来不错;超过 2 天前创建的行现已删除。

这份工作本身看起来如何?

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

SQL> select job, what, last_date, next_date from user_jobs where job = 2983310;

       JOB WHAT                 LAST_DATE        NEXT_DATE
---------- -------------------- ---------------- ----------------
   2983310 p_del_resetlink;     15.06.2021 09:19 16.06.2021 03:00

SQL>

最后一次执行是在几分钟前(今天 09:19),下一次执行将在明天 03:00(之后的每一天,再次执行 03:00)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多