出于性能原因,我想重写以下内容以使用BULK COLLECT和FORALL,而不是在循环中进行插入。我遇到的问题是,必须在循环的每次迭代中生成empID,或者我需要使用BULK COLLECT做类似的事情来创建一个使用FORALL的集合。
...
FOR i in 1 .. numberOfEmployeesToAdd
LOOP
BEGIN
empID := EMPLOYEE_SEQ.NEXTVAL;
INSERT INTO EMPLOYEE (ID,FIRST_NAME,LAST_NAME)
VALUES (empID, 'firstNameTest', 'lastNameTest');
INSERT INTO EMPLOYEE_DEPT_ASSOC (ID, DEPT_ID, EMP_ID)
VALUES (EMPLOYEE_DEPT_ASSOC_SEQ.NEXTVAL, '247', empID);
INSERT INTO SKILLSET (ID, EMP_ID, SKILL_ID)
VALUES (SKILLSET_ASSOC.NEXTVAL, empID, '702');
END;
END LOOP;
BULK COLLECT和FORALL的例子似乎主要包括创建一个游标,你可以从[some table]中选择*,然后获取该游标并执行BULK COLLECT。但是,我需要以某种方式使用下一个连续的&number; numberOfEmployeesToAdd'来动态地在游标中分配值。 ID的数量,然后执行FORALL来执行插入。
答案 0 :(得分:0)
这不会帮助你吗?如果您有一组包含数据集的嵌套表,则可以将其加入SELECT
INSERT INTO EMPLOYEE (ID,FIRST_NAME,LAST_NAME)
SELECT EMPLOYEE_SEQ.NEXTVAL, 'firstNameTest', 'lastNameTest'
FROM DUAL
CONNECT BY LEVEL <= numberOfEmployeesToAdd;
INSERT INTO EMPLOYEE_DEPT_ASSOC (ID, DEPT_ID, EMP_ID)
SELECT EMPLOYEE_DEPT_ASSOC_SEQ.NEXTVAL, '247', ID
FROM EMPLOYEE;
INSERT INTO SKILLSET (ID, EMP_ID, SKILL_ID)
SELECT SKILLSET_ASSOC.NEXTVAL, ID, '702'
FROM EMPLOYEE;