개발새발

[oracle/mybatis]sequence를 포함한 bulk insert 본문

Data Base/oracle

[oracle/mybatis]sequence를 포함한 bulk insert

재래김유진 2023. 10. 24. 10:21
728x90
반응형

일반적으로 쓰는 bulk insert의 문법은 아래와 같다.

오라클의 INSERT ALL과 마이바티스의 foreach를 사용하여 INSERT ALL 이후의 문법을 여러 번 반복하는 것이다.

INSERT ALL
<foreach collection="list" index="index" item="list" >
	INTO STUDENT_TABLE
	(
		STUDENT_ID
	    , STUDENT_SCHOOL_ID
	    , STUDENT_NAME
	    , STUENT_SEX
	    , STUDENT_ADDR
	    , STUDENT_AGE
	)
	VALUES
	(
		#{list.studentId}
		, #{list.schoolId}               
	    , #{list.studentName}
	    , #{list.studentSex}
	    , #{list.studentAddr} 
	    , #{list.studentAge} 
	)
</foreach>
SELECT * FROM DUAL

 

하지만 테이블에  INSERT를 하면서 시퀀스를 사용해야한다면 위의 일반적인 bulk insert로는 에러가 난다.

 

따라서, 시퀀스를 따로 SELECT 해온 후 나머지 list로 돌릴 컬럼들만 서브쿼리 형식으로 foreach로 감싸준다. 

 

그렇게 되면 separator="UNION ALL"로 해놓았기 때문에 foreach 돌릴 리스트 개수만큼 UNION ALL로 묶인다.

여기서 주의할 점은 서브쿼리 형식으로 리스트 개수만큼의 데이터들을 돌리기 때문에 foreach 태그 안 컬럼들은 INSERT 되어야 할 컬럼명에 맞게 ALIAS를 붙여줘야 한다.

 

INSERT INTO STUDENT_TABLE(
            STUDENT_ID
            , STUDENT_SCHOOL_ID
            , STUDENT_NAME
            , STUENT_SEX
            , STUDENT_ADDR
            , STUDENT_AGE
        )
    SELECT SEQ_STUDENT_ID.NEXTVAL
            , D1.* FROM
    (
    <foreach collection="studentInfo" item="list" separator="UNION ALL">
        SELECT
            #{schoolId}                AS STUDENT_SCHOOL_ID
            , #{list.studentName}           AS STUDENT_NAME
            , #{list.studentSex}    AS STUENT_SEX
            , #{list.studentAddr}  AS STUDENT_ADDR
            , #{list.studentAge}     AS STUDENT_AGE
        FROM DUAL
    </foreach>
    ) D1

 

728x90
반응형

'Data Base > oracle' 카테고리의 다른 글

[ORACLE] 숫자 마스킹 처리(치환)  (0) 2023.10.25
[oracle] 28001 비밀번호 만료  (0) 2019.12.22
Comments