기술 정보
home
채널 소개
home

Update 시 발생하는 dml 오류 해결

문서 유형
장애 해결
분야
App개발
키워드
DML
적용 제품 버전
6FS01
6FS02
6FS03
6FS04
6FS05
6FS06
6FS07
1 more property

현상

slog 및 tbsvr.out 파일 상에 Internal Error with condition 'update_col->node_type == EXPN_PARSE_COLUMN' 오류가 발생합니다.
주로 update 상황에서 발생하게 되며, update 구문의 set절의 대상이 되는 부분에 컬럼이 아닌 함수형태의 인자가 오게되면 Internal Error가 발생합니다.
--예시 1 SQL > create table t3(c1 date); SQL > update t3 set to_date(c1,'YYYY-MM-DD') = to_date('2024-05-31', 'YYYY-MM-DD');ex 2) --예시2 SQL > create table t1(c1 varchar(200)); SQL > update t1 set trim(c1) = to_char(sysdate, 'yyyy');
SQL
복사
--Slog [01-03T16:36:02.944561] [CSC-404] [I] RECV ERROR. errno=104 [01-03T16:37:48.667926] [COM-119] [I] Internal Error with condition 'update_col->node_type == EXPN_PARSE_COLUMN' (dml_update.c:656) (pid=31897, sessid=119, tid=119, os_thr_id=32246) [01-03T16:37:53.421352] [FRM-119] [I] THROW. ec=ERROR_SESS_KILLED(-12001) [ Session has been closed. ] (csr_id:1951) [tbsvr_tracedump.c:294:tb_thr_assert_cmd] [01-03T16:38:10.846902] [CSC-181] [I] RECV ERROR. errno=104
SQL
복사

원인

update dml 수행 시, set 절의 대상이 컬럼이 아닌 경우 해당 오류가 발생합니다.

Case 1. table 정의는 varchar이나, set절 대상에 trim 함수를 사용한 경우

SQL> desc t3; COLUMN_NAME TYPE CONSTRAINT ---------------------------------------------------------------------------- C1 VARCHAR(20) SQL> update t3 set trim(c1) = 'a'; --이 경우 t3테이블 업데이트 쿼리의 set 절에 c1이라는 자체컬럼이 아닌, trim이라는 함수를 통하여 set 절의 대상이 되었으므로 오류 발생
SQL
복사

Case 2. table 정의는 date이나, set절 대상에 to_ 함수를 사용한 경우

SQL> desc t1; COLUMN_NAME TYPE CONSTRAINT ---------------------------------------------------------------------------- C1 DATE SQL > update t1 set to_date(c1,'YYYY-MM-DD') = to_date('2024-05-31', 'YYYY-MM-DD'); --이 경우 t3테이블 업데이트 쿼리의 set 절에 c1이라는 자체컬럼이 아닌, to_date라는 함수를 통하여 set절의 대상이 되었으므로 오류 발생
SQL
복사
참고
위 두 예시는 오류 상황을 재현하기 위해 극한으로 설정한 예 입니다.

해결

패치를 적용해 문제를 해결합니다. (적용패치: 141401)
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.
더욱 근본적인 해결을 위해서는 SET 절에 컬럼이 아닌 다른 값이 오지 않도록 set 절의 대상에 정확한 컬럼을 명시하는 등 아래의 ‘수정 쿼리’ 예시처럼 변경작업이 필요합니다.
Case 1. table 정의는 varchar이나, set절 대상에 trim 함수를 사용한 경우
SQL> desc t3; COLUMN_NAME TYPE CONSTRAINT ---------------------------------------------------------------------------- C1 VARCHAR(20) --오류발생 쿼리 SQL> update t3 set trim(c1) = 'a'; --수정 쿼리 SQL> update t1 set c1 = 'a';
SQL
복사
Case 2. table 정의는 date이나, set절 대상에 to_ 함수를 사용한 경우
SQL> desc t1; COLUMN_NAME TYPE CONSTRAINT ---------------------------------------------------------------------------- C1 DATE --오류발생 쿼리 SQL > update t1 set to_date(c1,'YYYY-MM-DD') = to_date('2024-05-31', 'YYYY-MM-DD'); --수정 쿼리 SQL > update t1 set c1 = to_date(sysdate, 'yyyy-mm-dd');
SQL
복사