반응형
에러메시지
Error updating database. Cause: java.sql.SQLException: ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음
현상/원인
MERGE INTO T_TEST
USING DUAL
ON (CODE = #{code} AND USER_SEQ = #{userSeq})
WHEN MATCHED THEN
UPDATE SET
USER_SEQ = #{userSeq}
, USER_ID = #{userId, jdbcType=VARCHAR}
, NAME = #{name, jdbcType=VARCHAR}
, ORG_CD = #{orgCd, jdbcType=VARCHAR}
, ORG_HEADQUARTER_CODE = #{orgHeadquarterCode, jdbcType=VARCHAR}
, ORG_BRANCH_CODE = #{orgBranchCode, jdbcType=VARCHAR}
, ORG_PROJECTOFFICE_CODE = #{orgProjectofficeCode, jdbcType=VARCHAR}
, CODE = #{code}
, USE_YN = #{useAt}
WHEN NOT MATCHED THEN
INSERT(
SEQ
, USER_SEQ
, USER_ID
, NAME
, REG_ID
, ORG_CD
, ORG_HEADQUARTER_CODE
, ORG_BRANCH_CODE
, ORG_PROJECTOFFICE_CODE
, CODE
, SYS_SEQ
) VALUES (
SEQ_T_TEST.NEXTVAL
, #{userSeq}
, #{userId, jdbcType=VARCHAR}
, #{name, jdbcType=VARCHAR}
, #{regId, jdbcType=VARCHAR}
, #{orgCd, jdbcType=VARCHAR}
, #{orgHeadquarterCode, jdbcType=VARCHAR}
, #{orgBranchCode, jdbcType=VARCHAR}
, #{orgProjectofficeCode, jdbcType=VARCHAR}
, #{code}
, #{sysSeq}
)
MERGE INTO 쿼리 작성 후 테스트하고 ON 조건을 새로 넣으면서 생긴 오류입니다.
원인은 오류 내용에 나와있습니다.
'ON 절에 조건으로 넣은 칼럼은 UPDATE로 갱신하면 안 된다'가 요지입니다.
쿼리에 보시면 USER_SEQ가 ON절에도 UPDATE 에도 있습니다.
그럼 INSERT는 괜찮은가?
INSERT는 새로운 데이터를 넣는 것이므로 갱신이 아니기에 괜찮습니다.
해결
MERGE INTO T_TEST
USING DUAL
ON (CODE = #{code} AND USER_SEQ = #{userSeq})
WHEN MATCHED THEN
UPDATE SET
USER_ID = #{userId, jdbcType=VARCHAR}
, NAME = #{name, jdbcType=VARCHAR}
, ORG_CD = #{orgCd, jdbcType=VARCHAR}
, ORG_HEADQUARTER_CODE = #{orgHeadquarterCode, jdbcType=VARCHAR}
, ORG_BRANCH_CODE = #{orgBranchCode, jdbcType=VARCHAR}
, ORG_PROJECTOFFICE_CODE = #{orgProjectofficeCode, jdbcType=VARCHAR}
, CODE = #{code}
, USE_YN = #{useAt}
WHEN NOT MATCHED THEN
INSERT(
SEQ
, USER_SEQ
, USER_ID
, NAME
, REG_ID
, ORG_CD
, ORG_HEADQUARTER_CODE
, ORG_BRANCH_CODE
, ORG_PROJECTOFFICE_CODE
, CODE
, SYS_SEQ
) VALUES (
SEQ_T_TEST.NEXTVAL
, #{userSeq}
, #{userId, jdbcType=VARCHAR}
, #{name, jdbcType=VARCHAR}
, #{regId, jdbcType=VARCHAR}
, #{orgCd, jdbcType=VARCHAR}
, #{orgHeadquarterCode, jdbcType=VARCHAR}
, #{orgBranchCode, jdbcType=VARCHAR}
, #{orgProjectofficeCode, jdbcType=VARCHAR}
, #{code}
, #{sysSeq}
)
USER_SEQ를 ON 절에 조건으로 주었으면 UPDATE할 때는 삭제 해주어야 합니다.
반응형
'IT 개발 > 에러' 카테고리의 다른 글
[에러] ORACLE ORA-00904: "...": invalid identifier (0) | 2023.03.15 |
---|---|
[Oracle] SUM()해도 결과가 안 나올 때 (0) | 2023.03.14 |
[에러] mixed content: the page at 'https://.....' was loaded over https, but requested an insecure xmlhttprequest endpoint the content must be served over https. (0) | 2023.03.08 |
[Oracle] ORA-00957: 열명이 중복되었습니다 (0) | 2023.03.03 |
[에러] ORA-01861: 리터럴이 형식 문자열과 일치하지 않음 (0) | 2023.02.23 |
댓글