에러메시지
### Cause: java.sql.SQLSyntaxErrorException: ORA-02021: 원격 데이터베이스에 DDL 작업이 허용되지 않습니다 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-02021: 원격 데이터베이스에 DDL 작업이 허용되지 않습니다 at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91) ~[spring-jdbc-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.0.9.RELEASE.jar:4.0.9.RELEASE] at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74) ~[mybatis-spring-1.2.5.jar:1.2.5] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:421) ~[mybatis-spring-1.2.5.jar:1.2.5] at com.sun.proxy.$Proxy32.insert(Unknown Source) ~[?:?] at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:254) ~[mybatis-spring-1.2.5.jar:1.2.5]

현상/원인
<insert id="lvlStation" parameterType="java.util.List">
/* Fac.lvlStation*/
<![CDATA[
INSERT INTO VI_TB_HT (
MAPID_VERSION
, MODEL_ID
, MEAS_DT
, CONNECTED
, LVL
]]>
)
<foreach item="item" collection="list" separator="UNION ALL">
SELECT
#{item.mapidVersion }
, #{item.modelId }
, TO_DATE(#{item.measDt }, 'YYYYMMDDHH24MISS')
, #{item.connected }
, #{item.lvl }
FROM DUAL
</foreach>
</insert>
1. ORACLE 정책
데이터가 대량이라 한 번에 insert 작업을 해보려고 mybatis foreach를 사용해서 UNOIN ALL로 넣는 쿼리입니다. 그런데 해당 에러가 뜨더라고요. 알고보니 ORACLE에서는 VIEW에 다중 INSERT가 안 되는 정책이 있었습니다.
2. 트리거
해당 테이블은 원본 데이터 테이블이고 여기에 담기게되면 트리거에 의해서 다른 테이블에도 데이터가 담기게 됩니다. 트리거가 걸린 테이블은 데이터 하나씩 처리해야 하기 때문에 해당 foreach INSERT는 하지 않는 것이 좋습니다.
해결
if (resultList.size()>0) {
for (FacVO facVO : resultList ) {
cmmnService.insertContents(facVO, "Fac.insertContents");
}
}
Controller에 서 list에 수 만큼 insert 호출합니다.
물론 이것도 서버에 무리가 될 수 있습니다. 그렇기 때문에 한 번에 이 작업을 처리하는 게 아닌 데이터의 일정 파트를 나눠서 진행하도록 데이터 양에 따라 조절이 필요합니다.
<insert id="insertContents" parameterType="facVO">
/* Fac.insertContents*/
<![CDATA[
INSERT INTO TB_HT (
MAPID_VERSION
, MODEL_ID
, MEAS_DT
, CONNECTED
, LVL
) VALUES(
#{mapidVersion }
, #{modelId }
, TO_DATE(#{measDt }, 'YYYYMMDDHH24MISS')
, #{connected }
, #{lvl }
)
]]>
</insert>
뷰가 아니라 해당 본 테이블에 데이터를 넣는 것으로 변경합니다. 뷰가 아니더라도 트리거가 걸려있기 때문에 다중 insert는 하지 않았습니다.
더 좋은 방법이 있으시면 공유 부탁드립니다:^)
<참조사이트>
https://stackoverflow.com/questions/8917678/insert-all-into-a-table-over-a-dblink-is-it-possible
'IT 개발 > 에러' 카테고리의 다른 글
[Oracle] ORA-00957: 열명이 중복되었습니다 (0) | 2023.03.03 |
---|---|
[에러] ORA-01861: 리터럴이 형식 문자열과 일치하지 않음 (0) | 2023.02.23 |
[에러] Syntax error, unrecognized expression 에러 해결 (0) | 2023.02.09 |
[에러] ORA-01747: 열명을 올바르게 지정해 주십시오 (0) | 2023.02.08 |
[에러] nested exception is org.apache.ibatis.builder.BuilderException: The expression '...' evaluated to a null value. (0) | 2023.02.07 |
댓글