我有大量的 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
最佳答案
我认为您要关闭光标两次:
SQLFreeStmt(SQL_ CLOSE)
- 来自 MSDN : "关闭与 StatementHandle 关联的游标(如果已定义)并丢弃所有未决结果"
因此,调用 SQLCloseCursor 将返回“无效游标状态”(参见 Note)。
我想你需要的是:
SQLCloseCursor(hStmt);
SQLFreeHandle(SQL_HANDLE_STMT,hStmt) // replace SQLFreeStmt with this
关于c++ - 尝试关闭时游标状态无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148169/