最近两天,开发要求,清理掉某些表的部分数据,因为不能停业务,不能采用cast+rman方式实现.只能自己写脚本删除,在这些删除数据中,经过总结,共有三种类型:
1.删除单个表数据
删除a表以dealdate为范围的部分数据
DECLARE
P_SQL VARCHAR2(300) :=
'DELETE FROM a WHERE dealdate<to_date('||''''||
'2010-11-01 00:00:00'||''''||','||''''||'yyyy-mm-dd hh24:mi:ss'||''''||')';
P_COUNT NUMBER := 1000;
BEGIN
WHILE 1 = 1 LOOP
EXECUTE IMMEDIATE P_SQL || ' and rownum <= :nu'
USING P_COUNT;
IF SQL%NOTFOUND THEN
EXIT;
END IF;
COMMIT;
END LOOP;
COMMIT;
END;
2.删除两个关联表数据
tab_a,tab_b两个表通过共有的PRE_ID列关联,然后按照tab_a.ACCEPT_TIME列为条件删除两个表中数据,tab_b表中数据比tab_a多很多
DECLARE
CURSOR CUR IS
SELECT B.ROWID BID, A.ROWID AID
FROM tab_a A, tab_b B
WHERE A.PRE_ID = B.PRE_ID
AND A.ACCEPT_TIME <
TO_DATE('2010-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
ORDER BY B.ROWID;
V_COUNTER NUMBER;
BEGIN
V_COUNTER := 0;
FOR ROW IN CUR LOOP
DELETE FROM tab_a WHERE ROWID = ROW.AID;
DELETE FROM tab_b WHERE ROWID = ROW.BID;
V_COUNTER := V_COUNTER + 1;
IF (V_COUNTER >= 1000) THEN
COMMIT;
V_COUNTER := 0;
END IF;
END LOOP;
COMMIT;
END;
3.删除某个表中重复列
删除tab_a表中的COMPANY_ID/PY_DES/PY_DES_Q/PY_TYPE/RELATE_ID列重复数据
DECLARE
CURSOR CUR IS
SELECT A.ROWID AID
FROM tab_a A
WHERE ROWID NOT IN (SELECT MAX(B.ROWID)
FROM tab_a B
WHERE A.COMPANY_ID = B.COMPANY_ID
AND A.PY_DES = B.PY_DES
AND A.PY_DES_Q = B.PY_DES_Q
AND A.PY_TYPE = B.PY_TYPE
AND A.RELATE_ID = B.RELATE_ID)
ORDER BY A.ROWID;
V_COUNTER NUMBER;
BEGIN
V_COUNTER := 0;
FOR ROW IN CUR LOOP
DELETE FROM tab_a WHERE ROWID = ROW.AID;
V_COUNTER := V_COUNTER + 1;
IF (V_COUNTER >= 1000) THEN
COMMIT;
V_COUNTER := 0;
END IF;
END LOOP;
COMMIT;
END;