본문 바로가기
IT 개발/에러

ORA-38104: ON 절에서 참조되는 열은 갱신할 수 없음

by Dev.Jeon 2023. 3. 10.
반응형

에러메시지

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할 때는 삭제 해주어야 합니다.

반응형

댓글