Oracle过程或作业,根据时间线自动将数据从一个模式复制到另一个模式

时间:2017-05-15 16:45:35

标签: oracle plsql

我的数据库中有一个表格(Schema1),表格中有8.5百万条记录。大多数记录超过360天。

我有第二个架构(Schema2)具有相同的表格结构,并希望将所有记录从 360天之前的Schema1.table复制到此Schema2.table

同样,每周通过它都应收集下一行记录以便复制。

我的下面似乎并没有像我预期的那样起作用。

CREATE OR REPLACE PROCEDURE ARCHIVE_DATA
AS
   CURSOR Schema1_extract
   IS
      SELECT column1, column2, column3 FROM Schema1.table;
BEGIN
   FOR Schema2_insert IN Schema1_extract
   LOOP
      BEGIN
         INSERT INTO Schema2.table (column1, column2, column3)
              VALUES (column1, column2, column3);

         COMMIT;
      END;
   END LOOP;
END;

修改

在上面的第一个之后还有另外一个要执行的操作,因为我想用下面的语句从src表中清除已经合并的数据:

DELETE FROM src
      WHERE     table_date <= SYSDATE - 360
            AND table_id IN (SELECT table_id FROM trg.column);

1 个答案:

答案 0 :(得分:0)

尝试使用MERGE,您可以根据您的逻辑替换where条件以获取超过360天的记录。 ON条件应该是两个表的匹配连接列。

如果代码没问题,也许您可​​以安排每周运行。

我还建议使用BULK COLLECT插入记录,看看this

 CREATE OR REPLACE PROCEDURE ARCHIVE_DATA
AS
BEGIN
    MERGE
    INTO Schema2.table trg
    USING (
            SELECT
                column1
              , column2
              , column3
            FROM
                Schema1.table
            WHERE
                col_date >= 360
        )
        src
    ON
        (
            trg.column1 = src.column1
        )
    WHEN NOT MATCHED THEN
    INSERT
        (
            column1
          , column2
          , column3
        )
        VALUES
        (
            src.column1
          , src.column2
          , src.column3
        )
    ;

    COMMIT;
END;
/