행궁동 데이터 엔지니어

반응형

PCDATA(Parsed Character DATA)란 XML 파서에 의해 분석될 문자 데이터를 의미합니다.

간단히 말해 XML 요소의 시작 태그와 종료 태그 사이에 위치한 텍스트를 PCDATA라고 생각하면 됩니다.

출처 : http://tcpschool.com/xml/xml_dtd_component


DB에서 데이터를 불러와 사용할 때 PCDATA Invalid Char value Error가 발생하는 경우가 있습니다. 

 

"PCDATA Invalid Char value 26 Error" 케이스를 Oracle DB에서 해결하는 쿼리 아래에 남기겠습니다.

  • Oracle이 아닌 MySQL, PostgrSQL도 Replace 함수가 있으므로 동일한 방법으로 해결 가능
  • value 26이 아닌 기타 ASCII코드 1~31번 값들의 제거(NON PRINTABLE CHARACTERS)는 chr(26) 부분의 26을 다른 숫자로 변경해서 제거

 

Value 26번(SUBSTITUE, 장치에 표현 불가능한 문자 의미) 제거 예시

  • 테스트 환경 : Oracle 11g (MySQL, PostgreSQL 등 다른 DBMS에서도 Replace함수 사용해서 동일하게 처리 가능)
  • 사용 함수 및 간단한 사용법  : Replace, Translate
  • Replace(텍스트, 대체할문자열, 대체후문자열)
  • Ex) replace(안녕하세요, '안녕', '사랑') → 사랑하세요
  • Translate(텍스트, 대체할문자열-1개씩순서대로, 대체후문자열-1개씩순서대로)
  • Ex) Translate(안녕하세요, '안녕하', '사랑') → 사랑세요 (안→사, 녕→랑, 하→대체문자없어서 삭제)
WITH TEST_TABLE AS
(
SELECT 
    '문자열 확인' || CHR(26) || CHR(10) || 'LINE FEED (줄바꿈 적용)' AS TEST_STRING
FROM DUAL
)

-- 원본
SELECT 
    '원본' AS 구분
    , TEST_STRING AS 결과
FROM TEST_TABLE

/* CASE 1 : REPLACE 적용 */
UNION ALL
SELECT 
    'CASE 1 : REPLACE' AS 구분
    , REPLACE(TEST_STRING, CHR(26), '') AS 결과
FROM TEST_TABLE

/* CASE 2 : TRANSLATE 적용 */
-- TRANSLATE는 변환문자에 ''를 사용할 수 없음
UNION ALL
SELECT
    'CASE 2 : TRANSLATE' AS 구분
    , TRANSLATE(TEST_STRING, ' '||CHR(26)||CHR(10), ' ') AS 결과
FROM TEST_TABLE;

출력 결과

# 원본
"문자열 확인
LINE FEED (줄바꿈 적용)"

# Case 1 : chr26(SUB) 제거
"문자열 확인
LINE FEED (줄바꿈 적용)"

# Case 2 : chr26(SUB) 및 chr10(줄바꿈) 제거
문자열 확인LINE FEED (줄바꿈 적용)

 

기타 궁금하신 사항은 댓글 남겨주세요.

 

감사합니다.

 

참고자료

1. 젠트님 블로그, [Oracle] 오라클 TRANSLATE 함수 사용법, https://gent.tistory.com/232
2. Stack overflow, [Oracle REPLACE() function isn't handling carriage-returns & line-feeds] , https://stackoverflow.com/questions/407027/oracle-replace-function-isnt-handling-carriage-returns-line-feeds
3. 크빗님 블로그, [아스키 복슴 겸 아스키 표 제작], https://ddwroom.tistory.com/50#footnote_link_50_1

 

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band