我的数据库中有一个表格(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);
答案 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;
/