0

パフォーマンス上の理由から、ループで挿入を行うのではなく、BULK COLLECT と FORALL を使用するように次のコードを書き直します。私が直面している問題は、ループの反復ごとに empID を生成する必要があるか、FORALL を使用するコレクションを作成するために BULK COLLECT で同様のことを行う必要があることです。

...

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 に答える