본문 바로가기

IT/Oracle

오라클 오류 메세지 ORA-22922 존재하지 않는 LOB 값.

반응형


--------------------------------------------------

DB : 오라클 (ORACLE)

오류 메세지 :  ORA-22922 : 존재하지 않는 LOB 값.


영문 오류 메세지 : ORA-22922 nonexistent lob value.


--------------------------------------------------


ORA-22922 우연찮게 쿼리 튜닝을 하다 가 만난 오라클 에러 메세지다.

일에 치여 답답해 아무 생각 없이, 그냥 LOB는 뭔가 하고 멍때리다 한번 알아보기로 했다.


* LOB : Large Object 

?? 큰 객체?ㅋㅋ 뭐지...


다시 뒤돌아 보면  조회하고자한 내역을 살펴 보니,


Select USER_NM, wm_concat(HOBBY) AS HOBBY

  From USERINFO_DETAEIL 

 Gruop by USER_NM;

위와 같은 구조로 거대한 테이블을 새로운 뷰 (view) 로 문자열을 붙여 만들고자 하였다.

(위는 예라 그냥 가상의 명칭으로 적어두었다.)


위의 출력 구문 형태를 예상해보면, 

 USER_NM

 HOBBY

 홍길동

탁구,농구,출구 

 심청이

수영,발레 


이런 데이터가 수만개는 존재하는 테이블인데 WM_CONCAT 을 통해 하려니 문자열 합치는데 아무래도 지원되지 않는다는걸 이리저리 찾아보니 알게 되었다.


그중 지식인의 ORACLE LOB에 관한 이런글도 보게되었다.

오라클은 LOB을 저장하기 위한 여섯 가지 데이터 유형을 제공합니다.


- 큰 고정 폭(fixed-width) 문자 데이터를 위한 CLOB과 LONG 
- 큰 고정 폭 국가 character set 데이터를 위한 NCLOB
- 구조화되지 않은 데이터를 저장하기 위한 BLOB과 LONG RAW
- 구조화되지 않은 데이터를 운영 체제 파일에 저장하기 위한 BFILE

data type 별 가능한 크기

LONG : 가변 길이 문자 데이터(1~2Gbyte) 
CLOB : 단일 바이트 가변 길이 문자 데이터(1~4Gbyte) 
LONG RAW : 가변 길이 원시 이진 데이터(1~2Gbyte) 
BLOB : 가변 길이 이진 데이터(1~4Gbyte) 
BFILE : 가변 길이 외부 파일에 저장된 이진 데이터(1~4Gbyte)
RAW(n) : n Byte의 원시 이진 데이터(1~2000)

사용법은 기존의 방식으로 입력이 안됩니다.

님이 사용하는 tool이 무엇이냐에 따라 달라집니다. 

출처 : 네이버 지식인 cess98 님 답변 ( 바로가기 )


여튼 oracle wm_concat 의 대용량 조회의 사용시 ORA-22922 존재하지 않는 LOB 값이 발생 된다는것 같다.

위의 지식인님 말씀대로 툴이 문제라고 보기엔.. 좀 안맞는것 같긴하지만, 이진데이터가 용량이 제일 작으니

그런 형태로 문자를 합치는 역할을 하는 와중에 뷰로 만들다보니 초과 되는가 보다...


해결하려면 형변환 함수를 사용해보라는 글을 어디서 본것 같아 아래와 같이 변경해보았다.

Select USER_NM

       , TO_CHAR( wm_concat(HOBBY) ) AS HOBBY 

  From USERINFO_DETAEIL 

 Gruop by USER_NM;



결과는 ??  잘된다.... ㅋㅋㅋ; 


잘되니 우선 메모 해두고 일을 끝내야하니..  언젠가 내 머릿속에서 이어지기만 바래야겠다 ㅋㅋㅋ 


언젠가 더 자세히 알수 있을 그날까지 안뇽! 친구들 !!ㅋㅋ 여튼 해결 끝!

반응형