동적 SQL - 다중 행 INSERT + sequence

songi Jeon·2020년 12월 20일
0

SQL

목록 보기
1/2

다중 행 INSERT + sequence nextval

엑셀 파일을 DB에 저장하는 쿼리문을 작성했다. 다중 행 insert문으로 데이터베이스는 Oracle이다.

fNum은 행 번호인데 엑셀 파일에 임의로 입력해 두었었다. 이것을 sequence로 처리하여 넘버링하기 위해서는 fNum을 foreach 바깥으로 배치해야 한다.

수정 전

	<insert id="insertExcel" parameterType="com.begin.coffee.poi.domain.FestivalDTO">
		<foreach collection="excelContent" item="item" separator=" " open="INSERT ALL" close="SELECT * FROM DUAL" >
		INTO f_board( 
			fNum, fName, fPlace, fStart, fEnd, fContent, fSuper, fHost, fSponsor
			, fCall, fWeb, fInfo, fRoadName, fAddress, fLatitude, fLongitude, fDataDate
			)	VALUES 
			 <![CDATA[(
				f_board_seq.nextval
				,#{item.A}, #{item.B}
				, #{item.C}, #{item.D}
				, #{item.E}, #{item.F}
				, #{item.G}, #{item.H}
				, #{item.I}, #{item.J}
				, #{item.K}, #{item.L}
				, #{item.M}, #{item.N}
				, #{item.O}, #{item.P}
				)  ]]>
		</foreach>
	</insert>

수정 후

	<insert id="insertExcel" parameterType="com.begin.coffee.poi.domain.FestivalDTO">
		INSERT INTO f_board( 
			fNum, fName, fPlace, fStart, fEnd, fContent, fSuper, fHost, fSponsor
			, fCall, fWeb, fInfo, fRoadName, fAddress, fLatitude, fLongitude, fDataDate
			)
			SELECT f_board_seq.nextval, fNum.* FROM (
		<foreach collection="excelContent" item="item" separator="UNION ALL ">
			 <![CDATA[
				SELECT 
					  #{item.A} AS fName
					, #{item.B} AS fPlace
					, #{item.C} AS fStart
					, #{item.D} AS fEnd
					, #{item.E} AS fContent
					, #{item.F} AS fSuper
					, #{item.G} AS fHost
					, #{item.H} AS fSponsor
					, #{item.I} AS fCall
					, #{item.J} AS fWeb
					, #{item.K} AS fInfo
					, #{item.L} AS fRoadName
					, #{item.M} AS fAddress
					, #{item.N} AS fLatitude
					, #{item.O} AS fLongitude
					, #{item.P} AS fDataDate
				FROM dual ]]>
		</foreach>
			) fNum
	</insert>

SQL은 정말 보면 볼 수록 어려운것 같다..

참조 블로그

profile
비전공자가 백엔드 개발자 도전하는 블로그

0개의 댓글