문서유형ㅣ장애해결
분야ㅣ관리/환경설정
적용제품버전ㅣ7FS02PS
문서번호ㅣTADTS070
현상
테이블의 특정 컬럼을 REGEXP_REPLACE 함수를 통해 치환한 후 UPDATE 수행 시 TBR-11050 또는 JDBC-11050 에러가 발생합니다.
SQL> UPDATE T_QUESTION
SET QUESTION_ANSWER =
REGEXP_REPLACE(QUESTION_ANSWER,
'"monitor/MNT21_Question.do',
'/monitor/MNT21_Question.do')
WHERE DBMS_LOB.INSTR(QUESTION_ANSWER, '"monitor/MNT21_Question.do') > 0;
;
TBR-11050: The length of the source document used in the regular expression function is too long.
원인
LOB 컬럼의 데이터 크기 초과
REGEXP_REPLACE 함수는 1건당 최대 4MBYTES 까지의 데이터만 처리 가능합니다.
하지만 UPDATE 구문에 있는 QUESTION_ANSWER 컬럼의 특정 데이터가 4MBYTES를 초과하여 발생한 현상입니다.
- T_QUESTION 테이블 확인 결과, QUESTION_ANSWER 컬럼 타입은 CLOB으로 확인됩니다.
- TIBERO 에서 VARCHAR는 최대 65,53288 BYTE 까지만 선언 가능하기 때문에 해당 테이블의 DDL문을 확인하지 않아도 LOB TYPE인 것을 추정할 수 있습니다.
- UPDATE 문에 DBMS_LOB 함수를 사용하고 있으므로 LOB TYPE 인 것을 확인할 수 있습니다.
4MBYTES 초과 대상 확인
CLOB은 1글자 당 2BYTES씩 저장하는 자료구조로, 쿼리를 통해 4MBYTES 이상의 데이터가 존재하는지 확인합니다.
DBMS_LOB.GETLENGTH(LOB 컬럼) 함수는 대상 LOB 데이터의 길이를 반환하는 함수입니다.
이 때, 길이는 입력한 LOB 데이터의 타입에 따라 BYTE 또는 문자 단위의 값으로 반환 됩니다.
또한, 0(BLOB 데이터) 또는 공백(CLOB 데이터) 문자도 대상 LOB 데이터의 길이에 포함됩니다.
SELECT QUESTION_SEQ
, DBMS_LOB.GETLENGTH(QUESTION_ANSWER)
FROM APPLUSER.T_QUESTION
ORDER BY 2 DESC;
QUESTION_SEQ DBMS_LOB.GETLENGTH(QUESTION_ANSWER)
-------------------------------
BMM134846073430000052A 2,604,807
BMM134846073496666718A 2,403,748
BMM134846073563333384A 2,212,759
BMM134846073574444495A 2,185,353함수 수행 결과, 총 4건의 데이터가 4MBYTES 이상인 것이 확인되었습니다.
2,185,353 * 2BYTES / 1024 / 1024 = 4.16MBYTES
해결
파라미터 수정
현재 _EX_REGEXP_CLOB_MAX_LEN 파라미터는 디폴트값으로 2097152(2MBYTES)로 설정되어 있습니다.
최대 4194304(4MBYTES) 까지 변경하여 REGEXP_REPLACE 의 처리범위 를 확장 할 수 있습니다.
SQL> select NAME, DFLT_VALUE, IS_OPTIONAL from vt_parameter where NAME = '_EX_REGEXP_CLOB_MAX_LEN';
NAME DFLT_VALUE IS_OPTIONAL
------------------------- -------------------- -----------
_EX_REGEXP_CLOB_MAX_LEN 2097152 1
SQL> alter system set _EX_REGEXP_CLOB_MAX_LEN = 4194304;
System altered.
SQL> UPDATE T_QUESTION
SET QUESTION_ANSWER =
REGEXP_REPLACE(QUESTION_ANSWER,
'"monitor/MNT21_Question.do',
'/monitor/MNT21_Question.do')
WHERE DBMS_LOB.INSTR(QUESTION_ANSWER, '"monitor/MNT21_Question.do') > 0;
;
1 row updated.