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;
}
데이터베이스
오류 코드 예에 대한 설명서를 읽었을 때 여기에있는 경우를 볼 수 없습니다. 먼저, 검색된 문자열이 6 resp보다 길지 않다는 사실을 알고 있습니다. 8 자. 둘째, 버퍼가 길어질 때 동일한 버퍼 너비를 사용하면 문제가 없습니다. – user2672165
SQL Developer에서 쿼리를 실행하고 두 열 모두에서 함수 덤프를 사용하십시오. 7 바이트는 7 문자가 아닌 다른 것일 수 있습니다. 또한 charset 변환은 클라이언트 측에서 구현되며 응용 프로그램의 charset에 관계없이 db의 원시 charset으로 인코딩 된 문자열을받습니다. 두 열 폭을 4로 곱하면됩니다 (단 하나의 유니 코드 문자 당 4 바이트). – ibre5041
네 말이 맞습니다. 데이터베이스의 데이터가 올바르지 않아서 데이터가 버퍼에 맞는지 확인합니다. – user2672165