如何在PL/SQL中为Company表的每个公司生成50-250条随机Employee记录?
PL/SQL 实现为每个公司生成随机数量员工记录
以下是直接可用的PL/SQL代码,能针对Company表的每一条记录,生成50到250条随机员工数据插入Employee表:
DECLARE v_emp_count NUMBER; BEGIN -- 遍历每个公司记录 FOR company_rec IN (SELECT company_id, company_name FROM Company) LOOP -- 生成50到250之间的随机员工数量 v_emp_count := TRUNC(DBMS_RANDOM.VALUE(50, 251)); -- 批量插入员工记录 INSERT INTO Employee (employee_id, company_id, first_name, last_name, email, hire_date, salary) SELECT -- 自动生成员工ID(假设用序列,若表是自增主键可替换为对应方式) emp_seq.NEXTVAL, company_rec.company_id, -- 随机生成名字和姓氏 INITCAP(DBMS_RANDOM.STRING('L', 5)), INITCAP(DBMS_RANDOM.STRING('L', 7)), -- 生成邮箱:名字小写.姓氏小写@公司域名(简化处理) LOWER(DBMS_RANDOM.STRING('L', 5)) || '.' || LOWER(DBMS_RANDOM.STRING('L', 7)) || '@' || REPLACE(LOWER(company_rec.company_name), ' ', '') || '.com', -- 随机生成近3年内的入职日期 SYSDATE - TRUNC(DBMS_RANDOM.VALUE(0, 1096)), -- 随机生成3000到15000之间的薪资 TRUNC(DBMS_RANDOM.VALUE(3000, 15001)) FROM DUAL CONNECT BY LEVEL <= v_emp_count; COMMIT; -- 可根据数据量调整提交时机,比如每处理10个公司提交一次 END LOOP; DBMS_OUTPUT.PUT_LINE('所有公司的员工记录生成完成'); END; /
关键细节说明:
- 随机数量控制:用
TRUNC(DBMS_RANDOM.VALUE(50, 251))生成50到250的整数,因为VALUE(a,b)返回[a,b)区间的数,所以上限设为251才能包含250。 - 批量插入效率:使用
CONNECT BY LEVEL生成指定数量的行,配合INSERT ... SELECT批量插入,比单条循环插入效率高很多。 - 随机字段生成:
- 姓名用
DBMS_RANDOM.STRING('L', n)生成n位小写字母,再用INITCAP转为首字母大写。 - 邮箱结合公司名做简单处理,替换空格后作为域名部分。
- 入职日期取近3年(1096天)内的随机日期。
- 薪资生成3000到15000的随机整数。
- 姓名用
- 员工ID处理:假设用序列
emp_seq生成主键,如果你的Employee表用的是Oracle 12c+的IDENTITY自增列,可以把emp_seq.NEXTVAL替换为默认值或者直接省略该列(让数据库自动生成)。
注意事项:
- 确保
Company表的主键字段(这里用company_id)和Employee表的外键字段匹配,外键约束正常生效。 - 如果
Employee表有其他必填字段,需要在INSERT语句中补充对应随机值。 - 生成大量数据时,建议调整COMMIT时机,避免事务过大导致性能问题。
内容的提问来源于stack exchange,提问作者SunnyDays
相关产品推荐
相关产品推荐

