안녕하세요.
아래에 두 함수에 대해서 의문이 생겨서 문의 드립니다.
VSIZE : 문자, 숫자, 날짜 byte
LENGTHB : 문자 Byte
로 오다가다 설명을 들었습니다.
그런데 아래 퀴리문을 진행해 보니 두개에 경우가 다릅니다.
참고로 PV_MSG 컬럼은 XMLTYPE 입니다.
SELECT * FROM TABLE1
WHERE VSIZE(PV_MSG) < 4000;
Result => 정상적으로 출력...
SELECT * FROM TABLE1
WHERE LENGTHB(PV_MSG) < 4000;
SQL Error [19011] [72000]: ORA-19011: 문자열 버퍼가 너무 작음
답변에 감사드립니다.
몇가지 질문을 더 드리고 싶습니다.
1. "vsize 는 해당 항목 본연의 저장된 사이즈..." 라는 답변에서 "항목" 즉 "컬럼"으로 읽혀지는 "본연의 저장된 사이즈" 즉 "실제 저장된 데이터 사이즈" 라고 이해하면 될까요?
2. lengthb(xml) 문자열 변환처리란? xml 시작부터 끝까지 구성되어 있는 문법적 기호들까지 문자열로 변환한다고 이해를 하면 될까요?
이렇게 질문글을 쓰다 보니 한가지 더 드는 생각이 그럼 1 번에 경우 xml 구조에서 스칼라값만 사이즈를 인식한다는 뜻인가 하는 의구심이 듭니다.
이러한 생각에 이르게 된 이유는 현재 oracle xmltype 을 altibase varchar(32000) 으로 마이그레이션을 진행하였으나
데이터 마이그레이션이 되지 않고 오류가 발생한데에서 드는 의문입니다.
**참고로 oracle xmltype 컬럼에 대해서 vsize 로 select 해 보면, 4007 byte 가 제일 큰 사이즈 데이터 입니다.
바로 직전에 의문은 oracle 이 아니므로 꼭 답변을 듣고자 덮붙여 쓴 내용은 아니고, 이와 같은 스토리가 있다보니, "1 번에 경우 xml 구조에서 스칼라값만 사이즈를 인식한다는 뜻인가 하는 의구심이 듭니다." 라는 얘기를 드리는 겁니다.
3. 끝으로 이와 같이 대용량에 실제 사이즈를 확인 할 수 있는 방법을 찾고 있습니다만, 아직 찾지 못했습니다.
예를 들어 xmltype 컬럼 내에서 제일 큰 사이즈에 데이터에 사이즈가 얼마인가를 알 수 있을까요?
알 수 있다면 방법을 공유해 주실 수 있으실까요?
XML Type 의 문자열 변환에 대한 부분은 추측성 답변입니다.
XML Type 이 내부적으로 어떤 형태로 저장되고 변환되는지는 모릅니다.
다만, 저는 이 오류에 대해서 XML 에 주목하지 않고 LENGTHB 함수에 주목했습니다.
LENGTHB 함수가 필요로 하는 입력값은 문자입니다. 원래는 다른 타입이 들어오면 안되는 거죠.
다른 타입이 들어왔는데 타입 에러가 아닌 문자버퍼 오류가 난 부분에 주목한다면?
묵시적 형변환이 이루어 졌음을 미루어 짐작할 수 있습니다.
WITH t AS ( SELECT XMLTYPE('<xml>xml</xml>') x FROM dual UNION ALL SELECT XMLTYPE('<x>x</x>') FROM dual UNION ALL SELECT XMLTYPE('<html>html</html>') FROM dual ) SELECT x , VSIZE(x) v_s , LENGTHB(x) l_b FROM t ; -- Result -- 22, 14 16, 8 25, 17 -- 테스트 결과를 분석해 보면 -- lengthb : 저장된 xml 구문의 문자길이 -- vsize : lengthb + 8