2013-10-28 2 views
0

clobs 및 varchar2로 조금 실험했습니다. 우리가 데이터베이스 테이블에 많은 XML을 가지고 있으며 가능한 한 빨리 XML을 다운로드하려고했습니다. C# DevArt 구성 요소를 사용해야 할 때 여러 가지 방법을 시도하여 clob (행 당 데이터베이스로의 왕복 이동을 포함)이 varchar2보다 훨씬 느리다는 것을 알았습니다.ORA-06502 (varchar2에서 clob로 변환)

따라서 지금 데이터를 두 단계로 다운로드 중입니다. 먼저 varchar2 (4000 바이트 한도)만큼, 그 다음은 clob으로 모든 것을 할 수 있습니다.

이제 까다로운 부분.

select c.xml.getstringval() from customers c where 
length(t.xml.getclobval()) = length(dbms_lob.substr(c.xml.getclobval(), 4000, 1)) 

쿼리는 길이가 CLOB의 문자 수를 반환하고, SUBSTR가 함께 문자열을 반환한다는 가정에 기초한다 : 나는 VARCHAR2로 검색 할 수 있는지 확인하려면 다음 쿼리를 내놓았다 특정 바이트 수. 그것은 길이만으로는 작동하지 않습니다. 왜냐하면 나는 다중 바이트 문자로 문제를 일으키기 때문입니다. 하지만 지금은 또 다른 이상한 행동이 있습니다. 위의 쿼리는 대부분의 행에서 작동하지만 그 중 일부는 여전히 ORA-06502를 발생시킵니다. 하지만 3992로 제한을 변경하면 항상 작동합니까 ??? (정보로서 XML의 Base64로 인코딩 된 문자열로 그림의 축소판을 저장합니다).

누구나 쿼리가 모든 경우에 작동하지 않는 이유는 무엇입니까? 또는 clob을 varchar2로 검색 할 수 있는지 확인하는 쿼리를 작성하는 방법에 대한 제안 사항이 있습니까?

답변

0

SUBSTR가

Oracle documentation 바이트

특정 번호의 문자열을 반환하면 SUBSTR 함수의 양 파라미터가 캐릭터 (되지 바이트) CLOB에 대한 판독의 수를 의미했다.

그때

는 "Unicode=true;"연결 문자열 매개 변수를 사용하여 시도 à 전자의 오 데르 전자와 같은 multibytecharacters에 문제로 실행되기 때문에 그것은 단지 길이가 작동하지 않습니다.

위의 쿼리는 대부분의 행에서 작동하지만 그 중 일부는 여전히 ORA-06502를 발생시킵니다. 하지만 3992로 제한을 변경하면 항상 작동합니까 ???

send us 우리의 환경에서 문제를 재현 할 수 있도록 작은 테스트 프로젝트를하십시오. 또한 지정 (자격 증명이없는 약)

  • 연결 문자열
  • 해당 데이터베이스의 DDL/DML 스크립트가 Oracle 서버의
  • 버전, NLS_LANGUAGE, NLS_CHARACTERSET 및 NLS_NCHAR_CHARACTERSET 매개 변수를 객체
관련 문제