`
xieyj
  • 浏览: 103658 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

游标fetch源码分析

阅读更多

    嵌入式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能否满足事务隔离级别的要求

分享到:
评论

相关推荐

    oralce_游标_小葵花

    通过分析SG6_employee和SG6_toys的数据,我们可以设计和实现游标来执行以下任务: 1. 更新或删除特定员工的信息。 2. 统计满足特定条件的员工数量。 3. 将员工数据导出到其他格式,如CSV或XML。 4. 对多个表进行联接...

    数据库源码(游标,存储过程)大全

    在SQL中,我们使用`DECLARE`定义游标,`OPEN`打开游标,`FETCH`获取数据,`CLOSE`关闭游标,最后用`DEALLOCATE`释放游标资源。游标对于进行迭代处理、更新或删除特定行的数据操作至关重要,但因为其对系统资源的需求...

    python 开发链接Mysql数据库自动开启服务器demo源码+源码使用说明.zip

    5. 处理结果:如果执行的是查询语句,可以使用游标的fetch方法(如`fetchone()`, `fetchall()`)获取数据。 6. 关闭连接:在完成所有操作后,记得关闭数据库连接以释放资源。 此外,压缩包中的“源码使用说明”文档...

    数据库连接源码pro*c程序

    ### 数据库连接源码Pro*C程序详解 #### Pro*C简介 Pro*C是Oracle提供的一种预编译器,它允许开发者在C语言程序中嵌入SQL语句,从而更方便地进行数据库操作。这种方式使得程序员能够利用C语言的强大功能以及SQL语言...

    PLSQL学习笔记

    - DECLARE声明游标,OPEN打开游标,FETCH获取数据,CLOSE关闭游标。 6. **异常处理** - 使用`BEGIN...EXCEPTION...END`结构捕获和处理异常。 - 自定义异常通过RAISE语句抛出,系统异常如NO_DATA_FOUND、TOO_MANY...

    转:PLSQL开发笔记和小结

    可以定义游标变量,通过FETCH语句获取数据行。 7. **异常处理**:PLSQL的异常处理机制允许开发者对可能出现的错误进行预设的处理,如`BEGIN...EXCEPTION WHEN...END;`结构。 8. **存储过程和函数**:存储过程是一...

    libmySQL6.1 模块源码-易语言

    《深入解析libmySQL6.1模块源码——基于易语言》 libmySQL6.1是一个用于连接MySQL数据库的C库,它为开发者提供了一种...同时,源码分析也有助于提升我们的编程能力和解决问题的能力,为未来的技术创新打下坚实基础。

    Oracle函数文档

    - **游标操作**:DECLARE声明游标,OPEN打开游标,FETCH获取数据,CLOSE关闭游标。 - **异常处理**:BEGIN...EXCEPTION...END结构处理程序中的错误。 - **自定义函数和过程**:CREATE FUNCTION/PROCEDURE创建可...

    Oracle 11g ProC_C++编程艺术 源代码

    通过声明游标变量,如`EXEC SQL DECLARE cur CURSOR FOR SELECT ...`,然后使用`EXEC SQL OPEN cur`打开游标,`EXEC SQL FETCH cur INTO ...`获取数据,最后用`EXEC SQL CLOSE cur`关闭游标。 6. **异常处理**:...

    Oracle常见函数集锦

    - 在PL/SQL中,游标用于遍历查询结果,通过`OPEN`, `FETCH`, `CLOSE`操作实现。 8. **事务控制** - `COMMIT`:提交事务,保存所有更改。 - `ROLLBACK`:回滚事务,撤销所有更改。 - `SAVEPOINT`:设置事务中的...

    oracle函数大全

    - `FETCH cursor INTO variables`:从游标中获取数据。 - `CLOSE cursor`:关闭游标。 10. **系统信息函数**: - `USER`:返回当前用户。 - `DBMS_METADATA.GET_DDL(object_type, object_name)`:获取对象的DDL...

    OCI 经典代码

    oci_code.zip文件中的源码可能还包含了如何处理游标、事务控制、批处理操作、并发控制等高级特性,这些都是OCI提供的强大功能。学习和掌握这些知识对于开发高性能的Oracle数据库应用程序至关重要。

    Oracle常用SQL语句复习

    11. **游标**:游标用于处理单行结果集,允许我们按行操作数据。通过`DECLARE`, `OPEN`, `FETCH`, `CLOSE`等关键字进行操作。 12. **触发器**:触发器是一种数据库对象,会在特定的DML事件(INSERT, UPDATE, DELETE...

    perl oracle dbd zip

    5. **处理结果集**:使用fetchrow_array、fetchrow_hashref等方法获取查询结果,可以将结果转换为数组或哈希引用。 6. **事务管理**:DBI支持开始、提交和回滚事务,这对于保持数据库的一致性至关重要。 7. **错误...

    ORACLE函数大全

    - `OPEN`,`FETCH`,`CLOSE`:操作游标以遍历结果集。 10. **递归和集合函数**: - `CONNECT_BY_ROOT`:在层次查询中查找根节点。 - `XMLAGG`:将XML元素组合成一个单一的XML串。 文档“ORACLE函数大全.doc”...

    rather-simple-infinite-latest-posts

    这可以通过使用“游标”或者“OFFSET-FETCH”(对于SQL Server)或“LIMIT-BY”(对于MySQL)来实现。 6. 性能优化:无限滚动可能会导致大量数据库查询,所以你需要考虑缓存策略,如使用Redis或Memcached缓存结果,...

Global site tag (gtag.js) - Google Analytics