You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:35:32