【问题标题】:How Can We Delete A Table Row Automatically After a Specific Time in PL SQL我们如何在 PL SQL 中的特定时间后自动删除表行
【发布时间】:2016-01-20 16:02:52
【问题描述】:

我有下面给出相同列的拖车表:

表 1 PAYROLLFILE:

表 2 TEMP_PAYROLLFILE:

我编写了一个 PL SQL 函数,它将表 PAYROLLFILE 中的重复行插入到 TEMP_PAYROLLFILE 中,并从表 PAYROLLFILE 中删除原始行。简而言之,表 TEMP_PAYROLLFILE 正在为表 PAYROLLFILE 中删除的数据保留备份。

这是 PL SQL 函数代码:

FUNCTION Remove_transaction_by_id(employee_id NUMBER)
RETURN CLOB
AS
  cnt INT;
BEGIN
    INSERT INTO temp_payrollfile
    SELECT *
    FROM   payrollfile
    WHERE  empid = employee_id;

    DELETE FROM payrollfile
    WHERE  empid = employee_id;

    SELECT Count(*)
    INTO   cnt
    FROM   payrollfile;

    COMMIT;

    RETURN '<result><status>success</status> <row>'
           ||cnt
           || '</row></result>';
EXCEPTION
  WHEN OTHERS THEN
             RETURN '<result><status>Error</status></result>';
END remove_transaction_by_id; 

但是,我想做的还不止这些,我想自动删除表 TEMP_PAYROLLFILE 中的备份行在特定时间段结束后要做到这一点特定行。我需要触发器吗?我是新手,以前从未做过此类工作。如果有人知道这种技术,我将非常感谢您的帮助。如果需要更多详细信息,请告诉我。谢谢

更新:

我写了这个工作来清理旧行:它会工作吗?

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'oe.REMOVE_TEMP_PAYROLLFILE_JOB',
   job_type             => 'PLSQL_BLOCK',
   job_action           => 'BEGIN DBMS_STATS.GATHER_TABLE_STATS('oe',
                            'TEMP_PAYROLLFILE'); 
                            delete from TEMP_PAYROLLFILE where RECORDDATE < sysdate-1;
                            END;',
   start_date           => '20-JAN-16 1.00.00AM US/Pacific',
   repeat_interval      => 'FREQ=DAILY', 
   end_date             => '25-JAN-16 1.00.00AM US/Pacific',
   enabled              =>  TRUE,
   comments             => 'Gather table statistics');
END;

【问题讨论】:

  • 您可以定期执行存储过程以删除不需要的行(时间大于给定时间段)
  • 感谢@Kilanny 对这篇文章的第一次回复。但是我从来没有做过存储过程定期删除不需要的行。如果你知道一些代码然后请帮忙。谢谢

标签: oracle plsql


【解决方案1】:

您需要的是定期清理作业。使用DBMS_SCHEDULER,您可以配置重复执行此操作的作业:

delete from TEMP_PAYROLLFILE where recorddate < sysdate-60;

删除超过 60 天的记录。

These 是一些关于如何创建计划作业的示例。如下所示,job_action 部分接受一个 Pl/SQL 脚本,您可以在其中放置清理逻辑。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'oe.my_job1',
   job_type             => 'PLSQL_BLOCK',
   job_action           => 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(''oe'',
                            ''sales''); END;',
   start_date           => '15-JUL-08 1.00.00AM US/Pacific',
   repeat_interval      => 'FREQ=DAILY', 
   end_date             => '15-SEP-08 1.00.00AM US/Pacific',
   enabled              =>  TRUE,
   comments             => 'Gather table statistics');
END;
/

【讨论】:

  • 感谢@Gergely Bacso。非常有用的信息。我应该在哪里编写此代码,在我现有的函数中还是需要编写另一个。你能给我看一下吗。谢谢。
  • stackoverflow.com/questions/15384952/… 勾选此项以安排作业
  • @user5005768,我添加了一些额外的信息。
  • job_action 以 pl/sql 作为参数。因此,将您的清理 SQL 包装到 BEGIN ... END;,然后放入 job_action 字段。
  • 您要收集 table_stats 吗?不,那就不要。那只是一个例子。我不敢相信你在上面写了那个 Pl/sql 脚本,现在你突然无法理解这个了。我放弃。对不起。
【解决方案2】:

创建一个存储过程来执行删除:

CREATE PROCEDURE remove_Temp_Transacts_by_ID(
  in_employee_id IN NUMBER,
  in_datetime    IN TIMESTAMP
)
AS
BEGIN
  DELETE FROM temp_payrollfile
  WHERE  empid     = in_employee_id
  AND    datetime <= in_datetime;
END;
/

然后在您的函数中包含一个调用来安排一个作业以在以后运行该过程:

DBMS_SCHEDULER.CREATE_JOB(
  JOB_NAME   => 'Remove_TTbID__JOB',
  JOB_TYPE   => 'STORED_PROCEDURE',
  JOB_ACTION => 'remove_Temp_Transacts_by_ID'
  START_DATE => ( SYSTIMESTAMP + INTERVAL '2' HOURS ),
  ENABLED    => FALSE,
  COMMENT    => 'One time job to remove temporary payroll file entries'
);

DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
  JOB_NAME   => 'Remove_TTbID__JOB',
  ARGUMENT_POSITION => 1,
  ARGUMENT_VALUE    => employee_id
);

DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
  JOB_NAME   => 'Remove_TTbID__JOB',
  ARGUMENT_POSITION => 2,
  ARGUMENT_VALUE    => SYSTIMESTAMP
);

DBMS_SCHEDULER.ENABLE( 'Remove_TTbID__JOB' );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2014-03-04
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多