ORACLE 은 대량의 레코드 적재를 FORALL 키워드 를 이용하여, 벌크로 적재하는 기능을 제공합니다.
또한 이런 기능을 BULK INSERT 라고 칭합니다.
벌크 INSERT 는 레코드를 배열의 값에 저장하고 한번에 INSERT 하는 작업을 수행합니다.
예를들어서 테이블이 아래와 같은 경우,
CREATE TABLE MOZI ( C1 NUMBER, C2 NUMBER );
레코드를 3건 넣기 위해서는 INSERT 구문을 3번 수행해야 합니다.
SQL> INSERT INTO MOZI VALUES (1, 1); SQL> INSERT INTO MOZI VALUES (2, 2); SQL> INSERT INTO MOZI VALUES (3, 3); SQL> COMMIT;
반면, FORALL 을 사용하여 데이터를 배열에 담은 뒤 한번의 INSERT 구문으로 진해할 수 있습니다.
FORALL 은 프로시저 함수에서 사용가능하므로, 프로시저를 아시는 분에 한해서 사용할 수 있습니다.
SQL> DECLARE 2 TYPE mozi_ins IS TABLE OF MOZI%ROWTYPE INDEX BY BINARY_INTEGER; 3 tistory mozi_ins; 4 BEGIN 5 FOR i IN 1 .. 3 LOOP 6 tistory(i).C1 := i; 7 tistory(i).C2 := i; 8 END LOOP; 9 10 FORALL i in 1 .. 3 INSERT INTO MOZI VALUES tistory(i); 11 COMMIT; 12 END; 13 / PL/SQL procedure successfully completed.
만약 FORALL 을 사용하지 않고 일반 INSERT 프로시져를 작성하는 경우 다음과 같이 됩니다.
SQL> BEGIN 2 FOR i IN 1 .. 3 LOOP 3 INSERT INTO MOZI VALUES (i, i); 4 END LOOP; 5 COMMIT; 6 END; 7 / PL/SQL procedure successfully completed.
예를 들어보면, Java 의 Statement 와 PrepareStatement 의 비슷한 차이라고 생각하시면 됩니다.
'Database > Oracle' 카테고리의 다른 글
[ORACLE] 다중 테이블을 JOIN 하여 UPDATE 하기 (0) | 2018.09.09 |
---|---|
[ORACLE] SPM ( SQL Plan Management ) 로 실행 계획 관리하기 (0) | 2018.08.27 |
[ORACLE] SQL 병렬 힌트를 부여하여 쿼리 성능 높이기 (0) | 2018.08.22 |
[ORACLE] INS-35075: The specified SID is already in use 해결하기 (0) | 2018.08.07 |
[ORACLE] ORA-65096: invalid common user or role name 해결하기 (0) | 2018.08.07 |