|
如何删除数据库中的冗余数据(翻译) (9) CREATE OR REPLACE PROCEDURE DeleteDuplicates( pCommitBatchSize IN INTEGER := 5000) IS
CURSOR CSr_Duplicates IS SELECT ID, LastName, FirstName FROM Customers WHERE (LastName, FirstName) IN (SELECT LastName, FirstName FROM Customers GROUP BY LastName, FirstName HAVING COUNT(*) > 1) ORDER BY LastName, FirstName;
/*保存上一次的姓和名*/ vLastName Customers.LastName%TYPE := NULL; vFirstName Customers.FirstName%TYPE := NULL;
vCounter INTEGER := 0;
BEGIN
FOR vDuplicates IN csr_Duplicates LOOP IF vLastName IS NULL OR (vDuplicates.LastName != vLastName OR NVL(vDuplicates.FirstName, ' ') != NVL(vFirstName, ' ')) THEN /*第一次取出行或者是一个新行 保存它的姓和名的值*/ vLastName := vDuplicates.LastName; vFirstName := vDuplicates.FirstName;
ELSE /*冗余数据,删除它*/ DELETE FROM Customers WHERE ID = vDuplicates.ID;
vCounter := vCounter + 1;
/*提交结果*/ /* Commit every pCommitBatchSize rows */ IF MOD(vCounter, pCommitBatchSize) = 0 THEN COMMIT; END IF;
END IF; END LOOP;
IF vCounter > 0 THEN COMMIT; END IF;
|