2017-04-19 15 views
0

setPrefetchRowCount가이 경우 작동하지 않는 것처럼 setDataBuffer를 사용하여 커서를 통해 저장 프로 시저에서 리턴 된 행을 검색하고 있습니다. 버퍼가 반환 된 총 행 수보다 클 경우 setDataBuffer를 사용하면 올바르게 작동합니다. 내 경우에는 버퍼가 5000 행을 호스트 할 수 있고 리턴 된 행의 수는 538입니다. 버퍼의 길이를 100으로 줄이면 (max_numrows = 100 이하) 다음 세 번째 호출 (max_numrows)이 정확하게 수행됩니다 버퍼가 클 때와 같은 결과. 그러나 네 번째 호출에서 ORA-01406 : 페치 된 열 값이 잘린 예외가 발생합니다. 무슨 일이 벌어지고 있으며 어떻게 문제를 해결할 수 있습니까?오라클 OCCI setDataBuffer ORA-01406 : 페치 된 컬럼 값이 잘림

static const size_t max_numrows=5000; 
char var_buf[max_numrows][7]; 
char sym_buf[max_numrows][9]; 
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0); 
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0); 
sym.resize(var.size()); 
size_t fetch_count=0; 
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE) 
{ 
    for(size_t i=0;i<rs->getNumArrayRows();++i) 
    { 
     var[fetch_count*max_numrows+i]=var_buf[i]; 
     sym[fetch_count*max_numrows+i]=sym_buf[i]; 
    } 
    ++fetch_count; 
} 

데이터베이스

enter image description here

답변

0

이 행에 대한 것이 아니라 열 너비 약. 데이터베이스에서 가져온 일부 값은 7보다 큰 값을 갖습니다. 9 바이트.

+0

오류 코드 예에 대한 설명서를 읽었을 때 여기에있는 경우를 볼 수 없습니다. 먼저, 검색된 문자열이 6 resp보다 길지 않다는 사실을 알고 있습니다. 8 자. 둘째, 버퍼가 길어질 때 동일한 버퍼 너비를 사용하면 문제가 없습니다. – user2672165

+0

SQL Developer에서 쿼리를 실행하고 두 열 모두에서 함수 덤프를 사용하십시오. 7 바이트는 7 문자가 아닌 다른 것일 수 있습니다. 또한 charset 변환은 클라이언트 측에서 구현되며 응용 프로그램의 charset에 관계없이 db의 원시 charset으로 인코딩 된 문자열을받습니다. 두 열 폭을 4로 곱하면됩니다 (단 하나의 유니 코드 문자 당 4 바이트). – ibre5041

+0

네 말이 맞습니다. 데이터베이스의 데이터가 올바르지 않아서 데이터가 버퍼에 맞는지 확인합니다. – user2672165