Oracle+Mybatis의 foreach insert 대량 삽입 오류를 해결하는 빠른 해결 방법
해결 방향: 프로그램에서 List 집합 대상을 봉인하고 이 집합의 실체를 데이터베이스에 삽입합니다. 프로젝트는 MyBatis를 사용하기 때문에 MyBatis의foreach 기능을 사용하여 대량으로 삽입할 계획입니다.그 동안 "SQL 명령이 올바르게 끝나지 않았습니다"라는 오류가 발생하여 최종적으로 해결되었고 나중에 조회하고 학습할 수 있도록 기록되어 있습니다.
먼저 인터넷에서 Mybatis의 foreach insert에 관한 자료를 참고했는데 구체적으로는 다음과 같다.
foreach는 주로 구축 in 조건에 사용되며, SQL 문장에서 하나의 집합을 교체할 수 있다.
foreach 요소의 속성은 주로 item, index,collection,open,separator,close가 있습니다.
item은 집합 중의 모든 요소가 교체될 때의 별명을 나타낸다. index는 하나의 이름을 지정한다. 교체 과정에서 매번 교체되는 위치를 나타낸다. open은 이 문장이 무엇으로 시작되는지,separator는 매번 교체될 때 어떤 기호를 구분자로 하는지,close는 무엇으로 끝날지 나타낸다. foreach를 사용할 때 가장 관건적이고 오류가 발생하기 쉬운 것은collection 속성이다.이 속성은 반드시 지정해야 하지만, 서로 다른 상황에서 이 속성의 값은 다르다. 주로 다음과 같은 세 가지 상황이 있다.
1. 매개 변수가 단일 매개 변수이고 매개 변수 형식이 List일 때,collection 속성 값은list
2. 단일 매개 변수와 매개 변수 형식이array 그룹일 때collection의 속성 값은array
3. 전송된 매개 변수가 여러 개일 때 우리는 그것들을 하나의 맵으로 봉인해야 한다. 물론 단일 매개 변수도 맵으로 봉인할 수 있다
그리고 조롱박에 바가지를 그려 다음과 같은 xml 파일을 썼습니다.
xxxMapper.xml 파일:
<insert id="addSupCity" parameterType="java.util.List">
<selectKey keyProperty="cityId" order="BEFORE" resultType="String">
<![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]>
</selectKey>
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.cityId,jdbcType=VARCHAR},
#{item.cityCode,jdbcType=VARCHAR},
#{item.cityName,jdbcType=VARCHAR},
#{item.areaDesc,jdbcType=VARCHAR},
#{item.supId,jdbcType=VARCHAR},
#{item.stat,jdbcType=VARCHAR}
)
</foreach>
</insert>
그러나 실행된 후에 계속 오류를 보고합니다. 오류 정보는 다음과 같습니다.
### SQL: INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?)
### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL
SQL을 복사해서 PL/SQL에서 실행하는 것도 같은 오류입니다. 위에서 보듯이 대량으로 삽입하여 실행하는 SQL 문장은 다음과 같습니다. INSERT INTO T_OCL_SUPCITY (CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT) VALUES (?,?,?,?,?),(?,?,?,?,?),oracle에서 insert into xxxvalues(xxx, xxx), (xxx, xxx) 이런 문법은 통할 수 없다.다시 그 글을 돌이켜 보니 이것은 MySQL에 적용되고 Oracle에는 적용되지 않기 때문에 xml 파일을 수정합니다.
<insert id="addSupCity" parameterType="java.util.List">
INSERT INTO T_OCL_SUPCITY
(CITY_ID,CITY_CODE, CITY_NAME, AREA_DESC, SUP_ID, STAT)
SELECT SEQ_OCL_SUPCITY.NEXTVAL CITY_ID, A.*
FROM(
<foreach collection="list" item="item" index="index" separator="UNION ALL">
SELECT
#{item.cityCode,jdbcType=VARCHAR} CITY_CODE,
#{item.cityName,jdbcType=VARCHAR} CITY_NAME,
#{item.areaDesc,jdbcType=VARCHAR} AREA_DESC,
#{item.supId,jdbcType=VARCHAR} SUP_ID,
#{item.stat,jdbcType=VARCHAR} STAT
FROM dual
</foreach>
)A
</insert>
실행 통과.Oracle 릴리즈에서 주의해야 할 사항은 다음과 같습니다.
1. SQL에 VALUES가 없습니다.
2.
3.
위에서 말한 것은 편집자가 여러분께 소개한 Oracle+Mybatis의 foreach insert 기능을 대량으로 삽입하여 오류를 보고하는 빠른 해결 방법입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PLSQL을 사용하여 배열에서 가장 큰 요소 인쇄(Oracle Application Express 11g에서)배열에서 가장 큰 요소를 인쇄하는 것은 기본 코드입니다. 여기서는 Oracle Application Express 11g에서 PLSQL을 사용하여 어레이에서 가장 큰 요소를 인쇄하는 방법을 보여드리겠습니다. Orac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.