`
snrqtdhuqf
  • 浏览: 79642 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mysql数据库游标的使用

阅读更多

 

Mysql在5.0版本支持在存储过程中使用游标。

游标声明必须出现在处理程序声明变量条件声明

游标的使用如下:

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;
  OPEN cur2;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF done THEN
      LEAVE read_loop;
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP;

  CLOSE cur1;
  CLOSE cur2;
END;

 上面的例子是从官方提供的文档上找到的.

CREATE TABLE test(
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(50),
product_type INT
);

INSERT INTO test(product_name,product_type)VALUES('mobile',1);
INSERT INTO test(product_name,product_type)VALUES('computer',1);
INSERT INTO test(product_name,product_type)VALUES('apple',2);
INSERT INTO test(product_name,product_type)VALUES('Orange',2);

CREATE TABLE test_temp(
id INT,
product_name VARCHAR(50)
);

  

下面的是有游标的存储过程

DELIMITER $$
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id INT;
  DECLARE _product_name VARCHAR(50);
  DECLARE cur CURSOR FOR SELECT id,product_name FROM test WHERE product_type=1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;
  read_loop: LOOP
    FETCH cur INTO _id,_product_name;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO test_temp (id,product_name)VALUES(_id,_product_name);
  END LOOP;
  CLOSE cur;
END$$
DELIMITER;

 调用存储过程

CALL curdemo;

 查看运行结果

SELECT * FROM test_temp;

 运行结果为:

id	product_name
1	mobile
2	computer

 此存储过程是可以运行的,结果也是正确的,下面稍微修改一下存储过程.

DELIMITER $$
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id INT;
  DECLARE _product_name VARCHAR(50);
  DECLARE cur CURSOR FOR SELECT id,product_name FROM test WHERE product_type=1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;
  read_loop: LOOP
    FETCH cur INTO _id,_product_name;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SELECT product_type INTO @product_type FROM test WHERE product_type = 3;
    INSERT INTO test_temp (id,product_name)VALUES(_id,_product_name);
  END LOOP;
  CLOSE cur;
END$$
DELIMITER;

 清空test_temp表数据

TRUNCATE TABLE test_temp;

 再次调用存储过程后,

CALL curdemo;

SELECT * FROM test_temp;

 运行结果为:

id	product_name
1	mobile

 为什么少了一行数据,不就是多加了一条select 语句嘛

原因很简单,就是SELECT product_type INTO @product_type FROM test WHERE product_type = 3;

抛出了一个not found的异常,从而使得游标的循环终止了.

很多时候在游标循环的过程体中,调用了其他存储过程,但是我们不知道其他存储过程会不会抛出not found,我们的目的是循环完游标,怎么解决?

一种解决方法如下:

DELIMITER $$
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id INT;
  DECLARE _product_name VARCHAR(50);
  DECLARE cur CURSOR FOR SELECT id,product_name FROM test WHERE product_type=1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;
  read_loop: LOOP
    SET done = FALSE; 
    FETCH cur INTO _id,_product_name;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SELECT product_type INTO @product_type FROM test WHERE product_type = 3;
    INSERT INTO test_temp (id,product_name)VALUES(_id,_product_name);
  END LOOP;
  CLOSE cur;
END$$
DELIMITER;

 运行结果正常.

分享到:
评论

相关推荐

    Mysql数据库游标的使用

    MySql存储过程,游标的使用方法,速度极快!

    Mysql游标(循环操作)

    在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...

    MYSQL数据库的索引、视图、触发器、游标和存储过程

    ### MySQL数据库的关键特性详解 #### 一、索引(Index) **定义:** 索引是数据库中用于优化查询操作的一种特殊的数据结构。它本质上是表中一列或几列的值的集合及其对应的物理地址列表。 **优点:** 1. **提高检索...

    MySql游标的使用实例

    MySQL游标是数据库管理系统中的一个重要概念,主要用于在存储过程或函数中逐行处理查询结果集。游标允许程序按需一次处理一行数据,而非一次性获取所有数据,这在处理大量数据时尤其有用,因为它可以避免一次性加载...

    mysql游标

    MySQL游标是数据库管理系统中一个重要的概念,它在处理大量数据时非常有用,尤其是在需要逐行处理查询结果的情况下。游标允许程序动态地访问和操作数据集,而不是一次性加载所有结果。在MySQL中,游标主要用于存储...

    带你彻底搞懂python操作mysql数据库(cursor游标讲解)

    1、什么是游标? 一张图讲述游标的功能: ... 首先,使用pymysql连接上mysql数据库,得到一个数据库对象。 然后,我们必须要开启数据库中的游标功能,得到一个游标对象。 接着,使用游标对象中的execute

    mysql游标实现到了最后一个结束之后结束循环

    1. 游标使用完毕后,记得用`CLOSE`语句关闭,以释放系统资源。 2. 游标在事务中使用时,如果事务回滚,游标可能不会回到开始位置,因此在事务中使用游标需谨慎。 3. 游标效率相对较低,因为它们需要额外的内存和处理...

    python读取txt文件将数据导入mysql数据库

    在测试的时候,需要造模拟数据,或者是将生产环境的数据导出到测试环境中去,本文记录通过python读取txt文件,并将数据导入mysql数据库 1、示例代码: import pymysql # 打开数据库连接 conn = pymysql.connect(host...

    MySQL游标:数据库操作的精准定位器

    MySQL 是一个广泛应用的开源关系型数据库管理系统(RDBMS),是LAMP技术栈的重要组成部分,该技术栈包括Linux操作系统、Apache Web服务器、MySQL数据库以及PHP/Python/Perl等编程语言。MySQL 的特性包括但不限于: ...

    MySQL数据库笔试试题及答案(全)

    根据给定文件的信息,我们可以总结出一系列关于MySQL数据库的基础知识点,涵盖了SQL语言的基本操作、数据检索、表结构管理以及高级特性等内容。以下是针对文件中提到的一些关键知识点的详细解释: ### 1. 聚合函数 ...

    MySQL数据库考试题与答案.doc

    2. 游标的声明:在 MySQL 中,DECLARE 语句用于声明游标。 3. SELECT 语句的完整语法:SELECT 语句的完整语法至少包括 SELECT 和 FROM 两个部分。 4. 条件用 WHERE 子句表达:在 MySQL 中,WHERE 子句用于指定查询...

    最新如何从MQL5MQL4访问MySQL数据库.docx

    ### 最新如何从MQL5/MQL4访问MySQL数据库 #### 一、引言 在金融交易领域,尤其是外汇市场中,MetaTrader平台(包括MetaTrader 4 (MT4) 和 MetaTrader 5 (MT5))是非常流行的交易平台。为了增强交易策略的功能性和...

    python连接mysql数据库脚本工具

    在本场景中,我们关注的是使用Python连接MySQL数据库的脚本工具。MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了高效的存储和查询数据的能力。接下来,我们将深入探讨如何使用Python连接到MySQL数据库并...

    Python访问Mysql数据库

    - **跨平台**: Python的跨平台能力意味着可以在任何操作系统上使用相同的代码访问MySQL数据库。 - **社区支持**: Python和MySQL都有强大的社区支持,遇到问题时可以迅速获得帮助。 通过上述介绍可以看出,Python...

    Mysql的游标的定义使用及关闭深入分析

    尽管MySQL的游标使用方式与PL/SQL有所不同,但基本概念相似。 首先,定义游标是创建一个特定的指针,用于在查询结果集上移动。以下是一个例子: ```sql declare fetchSeqCursor cursor for select seqname, value ...

    pymysql python连接mysql数据库

    使用PyMySQL连接MySQL数据库的步骤如下: ```python import pymysql # 创建连接 conn = pymysql.connect(host='localhost', user='username', password='password', db='database', charset='utf8mb4') # 创建...

    从MySQL数据库中获取表格的结构信息,然后将其写入Excel文件中 效果一级棒,谁用谁知道

    # 3连接MySQL数据库,并创建游标对象; # 4获取数据库中所有表名,并循环处理每个表格: # a. 过滤掉不符合条件的表格; # b. 创建同名的Excel工作表; # c. 获取该表格的字段名、类型、长度和注释信息; # d. 将...

Global site tag (gtag.js) - Google Analytics