У меня есть большое количество INSERT-инструкций для запуска. Когда я запускаю их, я понимаю, что «превышено максимальное количество открытых курсоров».
ОК, Oracle, поэтому я закрою курсоры сразу после выполнения операторов INSERT.
SQLCloseCursor( hStmt )
Но Oracle говорит этому «Недопустимое состояние курсора».
Почему Oracle недоволен тем, что я закрываю курсор? Я тестировал этот же тип запроса через MySQL DSN, и MySQL, похоже, не жалуется на закрытие курсора сразу после оператора INSERT.
редактировать -
Вот код, который выполняет запрос
CHECK - это функция, которая проверяет SQLRESULT и регистрирует ошибку, если она возвращает TRUE в случае успеха, FALSE в случае неудачи. «status ()» использует SQLGetDiagRec () для регистрации остальной информации об ошибке.
SQLINTEGER nonquery( char * nonquery )
{
SQLINTEGER rowsAffected = 0 ;
SQLHANDLE hStmt ;
CHECK( SQLAllocHandle( SQL_HANDLE_STMT, hConn, &hStmt ), "allocate handle for statement" ) ;
if( !CHECK( SQLExecDirectA( hStmt, (SQLCHAR*)nonquery, SQL_NTS ), "execute query" ) )
{
status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
}
// Get rows affected
if( !CHECK( SQLRowCount( hStmt, &rowsAffected ), "row count after non-query" ) )
{
status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
}
if( ! CHECK( SQLFreeStmt( hStmt, SQL_CLOSE ), "Sql free stmt" ) )
{
status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
}
// CLose up.
if( !CHECK( SQLCloseCursor( hStmt ), "close cursor" ) )
{
status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
}
return rowsAffected ;
}
Я называю незапрашивающим вот так
nonquery( "sql statement" ) ;
Итак, я получаю:
[24000][0] [Oracle][ODBC]Invalid cursor state.
Сначала (что может быть связано с тем, что оператор INSERT не имеет курсора?), А затем, после многих вставок (запрос не просто вызывается много, много раз подряд), я получаю
ORA-01000: maximum open cursors exceeded