如何创建一个过程来检查表中是否有最近添加的记录,以及是否有将它们移动到归档表

时间:2016-08-10 08:37:18

标签: oracle procedure

我必须创建一个搜索最近添加的记录的过程,如果有,则将它们移动到ARCHIVE表。 这是我过滤最近添加的记录的声明

选择

   CL_ID,
   CL_NAME,
   CL_SURNAME,
   CL_PHONE,
   VEH_ID,
   VEH_REG_NO,
   VEH_MODEL,
   VEH_MAKE_YEAR,
   WD_ID,
   WORK_DESC,
   INV_ID,
   INV_SERIES,
   INV_NUM,
   INV_DATE,
   INV_PRICE

FROM

  CLIENT,
  INVOICE,
  VEHICLE,
  WORKS,
  WORKS_DONE

WHERE

  Client.CL_ID=Invoice.INV_CL_ID and
  Invoice.INV_CL_ID = Client.CL_ID and
  Client.CL_ID = Vehicle.VEH_CL_ID and
  Vehicle.VEH_ID = Works_Done.WD_VEH_ID and
  Works_done.WD_INV_ID = Invoice.INV_ID and
  WORKS_DONE.WD_WORK_ID = Works.WORK_ID and
  Works_done. Timestamp >= sysdate -1;

3 个答案:

答案 0 :(得分:0)

你可能需要这样的东西(伪代码):

create or replace procedure moveRecords is
    vLimitDate timestamp := systimestamp -1;
begin
    insert into table2
    select *
    from table1
    where your_date >= vLimitDate;
    --
    delete table1
    where your_date >= vLimitDate;
end;

答案 1 :(得分:0)

O.K。可能是这样的......

缺点是 - 大型桌子可能会很慢。

好处是不依赖日期和时间 - 所以你可以随时运行它并将你的档案与实时数据同步......

create or replace procedure archive is
begin
    insert into archive_table 
    (
    select * from main_table 
    minus 
    select * from archive_table
    );
end;

答案 2 :(得分:0)

以下是我过去用于此类任务的步骤。

  1. 创建一个全局临时表(GTT)来保存一组ROWID
  2. 执行多表直接路径插入,从源表中选择要存档的行,并将其ROWID插入GTT,将其余数据插入到存档表中。
  3. 从源表执行删除,其中源表ROWID位于rowid的GTT中
  4. 发出提交。
  5. 使用GTT和ROWID的业务可确保您在选择的行集中具有100%保证的稳定性,然后从源表中删除,无论在选择和开始之间可能发生的任何更改删除的开始(除了某人导致分区表行迁移或缩小表)。

    您也可以通过更改事务隔离级别来实现此目的。