在PL SQL中,我想用插入来重构这个for循环,通过使用BULK COLLECT和FORALL



出于性能考虑,我想重写下面的代码以使用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的例子似乎主要包括创建一个游标,然后从[某个表]中选择*,然后获取该游标并执行BULK COLLECT。但是,我需要使用下一个连续的'numberOfEmployeesToAdd' id数在游标内动态赋值,然后执行FORALL来执行插入。

这对你有帮助吗?如果您有一个包含数据集的嵌套表,您可以将它连接到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;

最新更新