嵌入式sql采用游标编程,一般有几步曲
1、EXEC SQL PREPARE sSql FROM :sql ;
2、EXEC SQL DECLARE cSql CURSOR FOR sSql ;
3、EXEC SQL OPEN cSql ;
4、EXEC SQL FETCH cSql INTO ...
while(sqlca.sqlcode....){ //判断结束条件
EXEC SQL FETCH cSql INTO ...
}
那mysql中fetch是如何实现的呢,看一下fetch的主要流程
先从sql_parse.cc中dispatch_command
case COM_STMT_FETCH:
{
mysql_stmt_fetch(thd, packet, packet_length);
break;
}
sql_prepare.cc
void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
{
....
if (!(stmt= find_prepared_statement(thd, stmt_id)))--先看执行了prepare没有
{
char llbuf[22];
my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), sizeof(llbuf),
llstr(stmt_id, llbuf), "mysql_stmt_fetch");
DBUG_VOID_RETURN;
}
.....
cursor= stmt->cursor; --是否declare游标
if (!cursor)
{
my_error(ER_STMT_HAS_NO_OPEN_CURSOR, MYF(0), stmt_id);
DBUG_VOID_RETURN;
}
cursor->fetch(num_rows); --执行具体的fetch操作
if (!cursor->is_open())--检查游标是否还打开
{
stmt->close_cursor();
thd->cursor= 0;
reset_stmt_params(stmt);
}
thd->restore_backup_statement(stmt, &stmt_backup);
thd->stmt_arena= thd;
DBUG_VOID_RETURN;
}
cursor->fetch(num_rows)有好几种实现,找个简单的分析一下
sql_cursor.cc
void Materialized_cursor::fetch(ulong num_rows)
{
THD *thd= table->in_use;
int res= 0;
result->begin_dataset();
for (fetch_limit+= num_rows; fetch_count < fetch_limit; fetch_count++)
{
if ((res= table->file->rnd_next(table->record[0])))
break;
/* Send data only if the read was successful. */
result->send_data(item_list); //直接从table里面读取,从临时表中读取
}
switch (res) { //根据不同结果,回复客户端不同信息
case 0:
thd->server_status|= SERVER_STATUS_CURSOR_EXISTS;
result->send_eof();
thd->server_status&= ~SERVER_STATUS_CURSOR_EXISTS;
break;
case HA_ERR_END_OF_FILE:
thd->server_status|= SERVER_STATUS_LAST_ROW_SENT;
result->send_eof();
thd->server_status&= ~SERVER_STATUS_LAST_ROW_SENT;
close();
break;
default:
table->file->print_error(res, MYF(0));
close();
break;
}
}
上面Materialized_cursor::fetch不满足事务隔离级别-游标稳定性,有时间看看
Sensitive_cursor::fetch能否满足事务隔离级别的要求
相关推荐
通过分析SG6_employee和SG6_toys的数据,我们可以设计和实现游标来执行以下任务: 1. 更新或删除特定员工的信息。 2. 统计满足特定条件的员工数量。 3. 将员工数据导出到其他格式,如CSV或XML。 4. 对多个表进行联接...
在SQL中,我们使用`DECLARE`定义游标,`OPEN`打开游标,`FETCH`获取数据,`CLOSE`关闭游标,最后用`DEALLOCATE`释放游标资源。游标对于进行迭代处理、更新或删除特定行的数据操作至关重要,但因为其对系统资源的需求...
5. 处理结果:如果执行的是查询语句,可以使用游标的fetch方法(如`fetchone()`, `fetchall()`)获取数据。 6. 关闭连接:在完成所有操作后,记得关闭数据库连接以释放资源。 此外,压缩包中的“源码使用说明”文档...
### 数据库连接源码Pro*C程序详解 #### Pro*C简介 Pro*C是Oracle提供的一种预编译器,它允许开发者在C语言程序中嵌入SQL语句,从而更方便地进行数据库操作。这种方式使得程序员能够利用C语言的强大功能以及SQL语言...
- DECLARE声明游标,OPEN打开游标,FETCH获取数据,CLOSE关闭游标。 6. **异常处理** - 使用`BEGIN...EXCEPTION...END`结构捕获和处理异常。 - 自定义异常通过RAISE语句抛出,系统异常如NO_DATA_FOUND、TOO_MANY...
可以定义游标变量,通过FETCH语句获取数据行。 7. **异常处理**:PLSQL的异常处理机制允许开发者对可能出现的错误进行预设的处理,如`BEGIN...EXCEPTION WHEN...END;`结构。 8. **存储过程和函数**:存储过程是一...
《深入解析libmySQL6.1模块源码——基于易语言》 libmySQL6.1是一个用于连接MySQL数据库的C库,它为开发者提供了一种...同时,源码分析也有助于提升我们的编程能力和解决问题的能力,为未来的技术创新打下坚实基础。
- **游标操作**:DECLARE声明游标,OPEN打开游标,FETCH获取数据,CLOSE关闭游标。 - **异常处理**:BEGIN...EXCEPTION...END结构处理程序中的错误。 - **自定义函数和过程**:CREATE FUNCTION/PROCEDURE创建可...
通过声明游标变量,如`EXEC SQL DECLARE cur CURSOR FOR SELECT ...`,然后使用`EXEC SQL OPEN cur`打开游标,`EXEC SQL FETCH cur INTO ...`获取数据,最后用`EXEC SQL CLOSE cur`关闭游标。 6. **异常处理**:...
- 在PL/SQL中,游标用于遍历查询结果,通过`OPEN`, `FETCH`, `CLOSE`操作实现。 8. **事务控制** - `COMMIT`:提交事务,保存所有更改。 - `ROLLBACK`:回滚事务,撤销所有更改。 - `SAVEPOINT`:设置事务中的...
- `FETCH cursor INTO variables`:从游标中获取数据。 - `CLOSE cursor`:关闭游标。 10. **系统信息函数**: - `USER`:返回当前用户。 - `DBMS_METADATA.GET_DDL(object_type, object_name)`:获取对象的DDL...
oci_code.zip文件中的源码可能还包含了如何处理游标、事务控制、批处理操作、并发控制等高级特性,这些都是OCI提供的强大功能。学习和掌握这些知识对于开发高性能的Oracle数据库应用程序至关重要。
11. **游标**:游标用于处理单行结果集,允许我们按行操作数据。通过`DECLARE`, `OPEN`, `FETCH`, `CLOSE`等关键字进行操作。 12. **触发器**:触发器是一种数据库对象,会在特定的DML事件(INSERT, UPDATE, DELETE...
5. **处理结果集**:使用fetchrow_array、fetchrow_hashref等方法获取查询结果,可以将结果转换为数组或哈希引用。 6. **事务管理**:DBI支持开始、提交和回滚事务,这对于保持数据库的一致性至关重要。 7. **错误...
- `OPEN`,`FETCH`,`CLOSE`:操作游标以遍历结果集。 10. **递归和集合函数**: - `CONNECT_BY_ROOT`:在层次查询中查找根节点。 - `XMLAGG`:将XML元素组合成一个单一的XML串。 文档“ORACLE函数大全.doc”...
这可以通过使用“游标”或者“OFFSET-FETCH”(对于SQL Server)或“LIMIT-BY”(对于MySQL)来实现。 6. 性能优化:无限滚动可能会导致大量数据库查询,所以你需要考虑缓存策略,如使用Redis或Memcached缓存结果,...