Post

ORACLE - INSERT MULTI ROWS , 대량 INSERT, BULK INSERT

#naver-import

원문: https://blog.naver.com/qoxmfaktmxj/222706284228

테이블 예시

CREATE TABLE INSA_MASTER (EMP_CODE VARCHAR2(50) NOT NULL ,EMP_NAME VARCHAR2(50) NOT NULL ,CHK_DATE DATE NOT NULL);

여러건 넣을 때 아래와 같이 INSERT 구문 3번 수행 (하지만 너무 여러 건이 일어난다고 가정 해보자)

INSERT INTO INSA_MASTER VALUES(‘1’,’강호동’,SYSDATE); INSERT INTO INSA_MASTER VALUES(‘2’,’유재석’,SYSDATE); INSERT INTO INSA_MASTER VALUES(‘3’,’김국진’,SYSDATE);

한번에 해보자

INSERT ALL INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) VALUES (‘1’,’강호동’,SYDATE) INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) VALUES (‘2’,’유재석’,SYDATE) INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) VALUES (‘3’,’김국진’,SYDATE) SELECT * FROM DUAL;

INSERT INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) SELECT (‘1’,’강호동’,SYDATE) FROM DUAL UNION ALL SELECT (‘2’,’유재석’,SYDATE) FROM DUAL UNION ALL SELECT (‘3’,’김국진’,SYDATE) FROM DUAL;

속도 차이가 있다. UNION ALL이 더 빠름

일일히 쿼리 자체를 수만번 적어줄 수 없기 때문에 파라미터 받아서 SQL 문 자체를 구성해서 넘기도록 구성해야 할듯 하다.

EX)XML 쿼리에 params에 넘어온 값들을 설정해 줘보자

INSERT ALL #foreach ($val in $params) INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) VALUES(‘$val.col1’,’$val.col2’,’$val.col3’) #end SELECT * FROM DUAL;

INSERT INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) SELECT S.EMP_CODE, S.EMP_NAME, S.CHK_DATE FROM (SELECT NULL AS EMP_CODE, NULL AS EMP_NAME, NULL AS CHK_DATE FROM DUAL #foreach ($val in $params) UNION ALL SELECT (‘$val.col1’,’$val.col2’,’$val.col3’) FROM DUAL #end )S WHERE S.EMP_CODE IS NOT NULL --돌려보진 않았지만 위와 같이 구성하면 될 것 같다.

아래는 다른 테이블 넣기

INSERT INTO INSA_MASTER(EMP_CODE, EMP_NAME, CHK_DATE) SELECT EMP_CODE, EMP_NAME, CHK_DATE FROM INSA_TEMP WHERE EMP_NAME LIKE ‘%유%’;

PROCEDURE 사용

DECLARE TYPE INSA_INS IS TABLE OF INSA_MASTER%ROWTYPE INDEX BY BINARY_INTEGER; INSA INSA_INS; ------------------------------------------------------------ BEGIN FOR i IN 1..3(LOOP 최고값 혹은 받아와 설정) IN LOOP INSA(i).EMP_CODE := 값; INSA(i).EMP_NAME := 값; INSA(i).CHK_DATE := 값; --값 설정 위에서 변수 설정해서 받아와서 해주면됨 END LOOP; FORALL i in 1..3 INSERT INTO INSA_MASTER VALUES INSA(i); COMMIT; END; ------------------------------------------------------------

혹은 BEGIN FOR i in 1..3 LOOP INSERT INTO INSA_MASTER VALUES(값1(i),값2(i),값3(i)); --마찬가지로 변수 설정 END LOOP; COMMIT; END;

직접 돌려보지 않아서.. 문법이 맞나..? 하지만 저런 느낌으로 코드에 맞게 다시 짜면 될 것 같음

PL/SQL 참고

https://goddaehee.tistory.com/99

[[Oracle] PL/SQL 기초 (정의, 특징, 사용방법, 변수선언 방법) [Oracle] PL/SQL 기초 (정의, 특징, 사용방법, 변수선언 방법) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [PL/SQL 기초] 입니다. :) ▶ PL/SQL (Procedural Language extension to SQL)  - SQL을 확장한 절..

goddaehee.tistory.com](https://goddaehee.tistory.com/99)

댓글