修正PLSQL块:实现emp表薪资同步及emp1表无重复日志插入
修正PLSQL块实现薪资同步与日志无重复插入
核心逻辑说明
原PLSQL块的薪资同步逻辑正常,但插入日志时因遍历全表导致重复记录。修正方案需仅捕获并插入EMP_ID=2实际更新的班次记录,同时通过存在性检查避免日志重复插入。
修正后的PLSQL代码
DECLARE TYPE emp_rec_type IS RECORD( emp_id emp.emp_id%TYPE, shift emp.shift%TYPE, salary emp.salary%TYPE ); TYPE emp_tab_type IS TABLE OF emp_rec_type; v_updated_recs emp_tab_type; BEGIN -- 同步EMP_ID=1的薪资到EMP_ID=2对应班次,捕获所有实际更新的记录 UPDATE emp e2 SET salary = (SELECT salary FROM emp e1 WHERE e1.shift = e2.shift AND e1.emp_id = 1) WHERE e2.emp_id = 2 AND EXISTS (SELECT 1 FROM emp e1 WHERE e1.shift = e2.shift AND e1.emp_id = 1) RETURNING emp_id, shift, salary BULK COLLECT INTO v_updated_recs; -- 批量插入日志,通过存在性检查避免重复 FORALL i IN 1..v_updated_recs.COUNT INSERT INTO emp1 (emp_id, shift, salary, sync_time) VALUES (v_updated_recs(i).emp_id, v_updated_recs(i).shift, v_updated_recs(i).salary, SYSDATE) WHERE NOT EXISTS ( SELECT 1 FROM emp1 WHERE emp_id = v_updated_recs(i).emp_id AND shift = v_updated_recs(i).shift AND salary = v_updated_recs(i).salary ); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END; /
关键优化点
- 精准捕获更新记录:通过
RETURNING ... BULK COLLECT INTO直接获取本次更新的EMP_ID=2的班次数据,避免全表遍历,只处理真正变更的记录 - 批量操作提升效率:使用
FORALL替代逐行循环,大幅提升插入日志的性能 - 避免重复插入:插入日志时通过
WHERE NOT EXISTS检查emp1中是否已有相同emp_id、shift、salary的记录,确保日志唯一性 - 无效更新过滤:更新时添加
EXISTS判断,仅更新EMP_ID=1存在的班次,避免对无对应班次的EMP_ID=2记录执行无效更新
示例验证
原emp表中EMP_ID=2的A班次薪资300、B班次400,同步后改为与EMP_ID=1一致的100和200,代码会捕获这两条更新记录,仅向emp1插入这两条记录;若emp1中已有相同记录,则跳过插入操作。
内容的提问来源于stack exchange,提问作者UserGoogle
相关产品推荐
相关产品推荐

