如何通过PL/SQL循环遍历两表实现组合数据插入hrrecords表
PL/SQL实现员工部门全配对插入HR记录方案
你需要的员工与部门全量配对(笛卡尔积规则)插入需求,通过PL/SQL双层嵌套循环即可实现,最终会生成3*3=9条目标记录,具体实现如下:
可直接运行的实现代码
默认hrrecords表存储员工与部门的关联字段为emp_id、empname、dep_id、depname,如果你的实际表字段有差异,直接替换代码中对应字段名即可:
DECLARE -- 游标:查询全量员工数据 CURSOR cur_emp IS SELECT emp_id, empname FROM employee; -- 游标:查询全量部门数据 CURSOR cur_dept IS SELECT dep_id, depname FROM department; BEGIN -- 外层循环逐行遍历员工 FOR emp_row IN cur_emp LOOP -- 内层循环逐行遍历部门,每个员工匹配所有部门 FOR dept_row IN cur_dept LOOP INSERT INTO hrrecords(emp_id, empname, dep_id, depname) VALUES (emp_row.emp_id, emp_row.empname, dept_row.dep_id, dept_row.depname); END LOOP; END LOOP; -- 提交事务持久化数据 COMMIT; DBMS_OUTPUT.PUT_LINE('操作完成,共插入' || SQL%ROWCOUNT || '条记录'); EXCEPTION WHEN OTHERS THEN -- 异常回滚避免脏数据 ROLLBACK; DBMS_OUTPUT.PUT_LINE('插入失败,错误原因:' || SQLERRM); END; /
使用注意事项
- 如果你的表字段名是带空格的
emp id、dep id,需要把代码中对应字段替换为带双引号的写法,例如SELECT "emp id", empname FROM employee,插入语句的字段列表也要同步修改,否则会报字段不存在的错误。 - 如果
hrrecords表有其他非空必填字段(比如记录生成时间、操作人ID等),需要在INSERT语句中补充对应字段的赋值逻辑。 - 代码执行完成后,可以执行
SELECT COUNT(*) FROM hrrecords;校验结果,返回数值为9即符合预期。 - 备注:如果没有强制要求PL/SQL循环,单条
INSERT INTO hrrecords SELECT * FROM employee, department;的笛卡尔积查询也能实现同样效果,但你明确要求循环实现的话,上述双层嵌套游标循环的方案完全满足需求。
内容的提问来源于stack exchange,提问作者Acsr
相关产品推荐
相关产品推荐

