CREATE OR REPLACE PROCEDURE PR_MOD_BASE( IScursor c_base)ISSELECT MIN(INVENTORY_DATE) IDATE, KUNNR, MATNR FROM STOCK_BASE_DATA GROUP BY TO_CHAR(INVENTORY_DATE, 'yyyy-MM-dd'), KUNNR, MATNR HAVING count(*) > 1;c_row c_base%rowtype;BEGIN FOR c_row IN c_base LOOP DELETE FROM STOCK_BASE_DATA WHERE INVENTORY_DATE = c_row.IDATE AND KUNNR = c_row.KUNNR AND MATNR = c_row.MATNR; END LOOP;COMMIT;END;
首先,我们需要创建或替换一个名为PR_MOD_BASE的存储程序。该存储程序接受一个REF_CURSOR类型的参数c_base,用来返回查询结果。存储程序的逻辑分为两部分:
1. **数据筛选与分组**:使用SELECT语句从STOCK_BASE_DATA表中提取数据。我们使用GROUP BY子句按日期、供应商代码和物料编号进行分组。MIN函数用于找出每组中最早的INVENTORY_DATE。通过HAVING条件筛选出那些包含多个重复记录的组。
2. **删除重复记录**:使用循环结构遍历返回的结果集。对于每一行记录,执行DELETE操作,确保只保留首次出现的记录。最后,使用COMMIT语句提交事务。
-- 创建或替换存储程序CREATE OR REPLACE PROCEDURE PR_MOD_BASE( IScursor c_base)IS-- 选择最小的INVENTORY_DATE并按条件分组SELECT MIN(INVENTORY_DATE) IDATE, KUNNR, MATNR FROM STOCK_BASE_DATA GROUP BY TO_CHAR(INVENTORY_DATE, 'yyyy-MM-dd'), KUNNR, MATNR HAVING count(*) > 1;c_row c_base%rowtype;BEGIN -- 遍历结果集并删除重复记录 FOR c_row IN c_base LOOP DELETE FROM STOCK_BASE_DATA WHERE INVENTORY_DATE = c_row.IDATE AND KUNNR = c_row.KUNNR AND MATNR = c_row.MATNR; END LOOP; -- 提交事务 COMMIT;END;