【发布时间】:2009-07-18 18:09:39
【问题描述】:
我有大量的 INSERT 语句要运行。当我运行它们时,我可以理解地得到“超出最大打开游标”。
OK Oracle,所以我将在运行 INSERT 语句后立即关闭游标。
SQLCloseCursor(hStmt)但是 Oracle 说这个“无效的游标状态”。
为什么 Oracle 对我关闭游标不满意?我通过 MySQL dsn 测试了相同类型的查询,MySQL 似乎没有抱怨在 INSERT 语句后立即关闭游标。
编辑 --
这是执行查询的代码
CHECK 是一个检查 SQLRESULT 并记录错误的函数,如果成功则返回 TRUE,如果失败则返回 FALSE。 "status()" 使用 SQLGetDiagRec() 记录其余的错误信息。
SQLINTEGER 非查询(字符 * 非查询) { SQLINTEGER rowsAffected = 0 ; SQLHANDLE hStmt ; CHECK( SQLAllocHandle( SQL_HANDLE_STMT, hConn, &hStmt ), "为语句分配句柄" ) ; if( !CHECK( SQLExecDirectA( hStmt, (SQLCHAR*)nonquery, SQL_NTS ), "执行查询" ) ) { 状态(SQL_HANDLE_STMT,hStmt,__LINE__); } // 获取受影响的行 if( !CHECK( SQLRowCount( hStmt, &rowsAffected ), "非查询后的行数" ) ) { 状态(SQL_HANDLE_STMT,hStmt,__LINE__); } if( ! CHECK( SQLFreeStmt( hStmt, SQL_CLOSE ), "Sql free stmt" ) ) { 状态(SQL_HANDLE_STMT,hStmt,__LINE__); } // 特写。 if( !CHECK( SQLCloseCursor( hStmt ), "关闭光标" ) ) { 状态(SQL_HANDLE_STMT,hStmt,__LINE__); } 返回行受影响; }我这样称呼非查询
非查询(“sql语句”);所以我得到:
[24000][0] [Oracle][ODBC]游标状态无效。起初,(可能是因为 INSERT 语句没有游标?),后来,在多次插入之后(非查询只是简单地连续调用很多次),我得到了
ORA-01000: 超出最大打开游标【问题讨论】: