현상
UTL_RAW.CONVERT 기능 사용 시 아래 예시코드와 같이 TBR-15146 오류 발생하였습니다.
DECLARE
rawvar RAW(100);
to_charset VARCHAR(100);
from_charset VARCHAR2(100);
literal VARCHAR2(100);
BEGIN
literal := 'A';
to_charset := 'US7ASCII';
from_charset := 'UTF8';
rawvar := utl_raw.convert(UTL_RAW.CAST_TO_RAW(literal), to_charset, from_charset);
dbms_output.put_line(rawvar);
END;
/
TBR-15146: PSM compilation error.
TBR-15046: Identifier is out of scope.
at line 10, column 11 of null:
rawvar := utl_raw.convert(UTL_RAW.CAST_TO_RAW(literal), to_charset, from_charset
SQL
복사
원인
UTL_RAW.CONVERT 기능이 구현된 패치가 존재하지 않아 TBR-15146 오류가 발생하였습니다.
해결
UTL_RAW.CONVERT 함수 사용 쿼리 수행 불가할 시, 232649 패치 포함 바이너리인지 확인이 필요합니다.
확인 후, FS07_CS_232649a 패치를 적용해 해결합니다.
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.
참고
utl_raw.convert 함수는 raw타입 데이터를 다른 charset의 raw타입 데이터로 변경하므로, 아래 순서를 적용하여 우회 가능합니다.
1. 변환하려는 raw 타입 데이터를 utl_raw.cast_to_varchar2 를 이용해 varchar타입으로 변경합니다.
2. 변환된 varchar타입 데이터를 CONVERT 함수의 인자로 하여 다른 charset으로 변경합니다.
3. 변환된 varchar타입 데이터를 utl_raw.cast_to_raw 함수를 통해 raw타입으로 변경합니다.
declare
str_utf varchar2(100);
str_euc varchar2(100);
r_utf raw(100);
r_euc raw(100);
begin
str_utf := convert ('테스트str', 'UTF8', 'EUCKR');
r_utf := utl_raw.cast_to_raw(str_utf); -- r_utf은 UTF8 charset의 raw데이터
str_utf := utl_raw.cast_to_varchar2(r_utf);
str_euc := convert(str_utf, 'EUCKR', 'UTF8');
dbms_output.put_line(str_euc); -- 정상 출력
r_euc := utl_raw.cast_to_raw(str_euc); -- r_euc는 EUCKR chatset의 raw데이터
end;
/
SQL
복사