0

出于性能原因,我想重写以下内容以使用 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。但是,我需要以某种方式使用下一个连续的“numberOfEmployeesToAdd”ID 数在游标内动态分配值,然后执行 FORALL 来进行插入。

4

1 回答 1

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;
于 2014-06-18T23:45:34.513 回答