嵌入式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能否满足事务隔离级别的要求
相关推荐
显式游标的用法 声明游标 CURSOR 游标名 IS SELECT语句FROM语句; 打开游标 OPEN 游标名; 提取游标 FETCH 游标名 INTO 变量列表; 关闭游标 CLOSE 游标名; 完整示例
当时自己初学SQL时,对游标很难理解,现在编写了一个实例游标循环,到时写...fetch next from cursor1 into @id,@name -- 定义一个游标有两个变量 while @@fetch_status=0 --返回值成功的时候循环 以上是我个人的理解
电动汽车用定子永磁型磁通记忆式游标电机性能分析.pdf
Oracle中PLSQL游标简介
Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
游标图例用来显示图形中的游标,如图1所示。在图形上用游标可读取绘图区域上某个点的确切值,游标值会显示在游标图例中。 图1 图形缩放方式 图2 游标图例 选择游标图例右键快捷菜单的“创建游标”,在...
机械设备(电子机械设备)类仪器仪表(电子仪器仪表)行业游标卡尺领域分析报告(研究报告).pdf
FETCH NEXT FROM c_test_main INTO @id, @value; --假如检索到了数据,才处理. WHILE @@fetch_status = 0 BEGIN PRINT @value; --填充下一条数据. FETCH NEXT FROM c_test_main INTO @id, @value; ...
游标卡尺行业(2021-2026)企业市场突围战略分析与建议.docx
oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结oracle游标的总结
SQL Server对游标的使用要遵循:声明游标–打开游标–读取数据–关闭游标–删除游标。下面让我们来看看几种常用游标是怎么使用的! 1、只读游标的使用(只能使用next提取数据) --声明一个只读游标 declare cur_stu ...
设置波形图的游标,设置游标参数,设置多个游标,可自由拖动。
本文实例讲述了MySQL游标概念与用法。分享给大家供大家参考,具体如下: 1、游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行。...fetch 游标名 into var1,var2[,.
Mysql游标(循环操作)
使用游标更新数据库
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或...
oracle游标使用大全,详细描述了如何使用游标,创建游标等等
游标的使用 游标的使用 游标的使用 游标的使用 游标的使用 不会可以联系我
游标算法_伪码.pdf
什么是游标?游标有什么作用?Oracle游标的类型?Oracle游标的状态有哪些,怎么使用游标属性?如何使用显示游标,?如何遍历循环游标?