엑셀 파일을 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은 정말 보면 볼 수록 어려운것 같다..