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中,游标主要用于存储...
1、什么是游标? 一张图讲述游标的功能: ... 首先,使用pymysql连接上mysql数据库,得到一个数据库对象。 然后,我们必须要开启数据库中的游标功能,得到一个游标对象。 接着,使用游标对象中的execute
1. 游标使用完毕后,记得用`CLOSE`语句关闭,以释放系统资源。 2. 游标在事务中使用时,如果事务回滚,游标可能不会回到开始位置,因此在事务中使用游标需谨慎。 3. 游标效率相对较低,因为它们需要额外的内存和处理...
在测试的时候,需要造模拟数据,或者是将生产环境的数据导出到测试环境中去,本文记录通过python读取txt文件,并将数据导入mysql数据库 1、示例代码: import pymysql # 打开数据库连接 conn = pymysql.connect(host...
MySQL 是一个广泛应用的开源关系型数据库管理系统(RDBMS),是LAMP技术栈的重要组成部分,该技术栈包括Linux操作系统、Apache Web服务器、MySQL数据库以及PHP/Python/Perl等编程语言。MySQL 的特性包括但不限于: ...
根据给定文件的信息,我们可以总结出一系列关于MySQL数据库的基础知识点,涵盖了SQL语言的基本操作、数据检索、表结构管理以及高级特性等内容。以下是针对文件中提到的一些关键知识点的详细解释: ### 1. 聚合函数 ...
2. 游标的声明:在 MySQL 中,DECLARE 语句用于声明游标。 3. SELECT 语句的完整语法:SELECT 语句的完整语法至少包括 SELECT 和 FROM 两个部分。 4. 条件用 WHERE 子句表达:在 MySQL 中,WHERE 子句用于指定查询...
### 最新如何从MQL5/MQL4访问MySQL数据库 #### 一、引言 在金融交易领域,尤其是外汇市场中,MetaTrader平台(包括MetaTrader 4 (MT4) 和 MetaTrader 5 (MT5))是非常流行的交易平台。为了增强交易策略的功能性和...
在本场景中,我们关注的是使用Python连接MySQL数据库的脚本工具。MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了高效的存储和查询数据的能力。接下来,我们将深入探讨如何使用Python连接到MySQL数据库并...
- **跨平台**: Python的跨平台能力意味着可以在任何操作系统上使用相同的代码访问MySQL数据库。 - **社区支持**: Python和MySQL都有强大的社区支持,遇到问题时可以迅速获得帮助。 通过上述介绍可以看出,Python...
尽管MySQL的游标使用方式与PL/SQL有所不同,但基本概念相似。 首先,定义游标是创建一个特定的指针,用于在查询结果集上移动。以下是一个例子: ```sql declare fetchSeqCursor cursor for select seqname, value ...
使用PyMySQL连接MySQL数据库的步骤如下: ```python import pymysql # 创建连接 conn = pymysql.connect(host='localhost', user='username', password='password', db='database', charset='utf8mb4') # 创建...
# 3连接MySQL数据库,并创建游标对象; # 4获取数据库中所有表名,并循环处理每个表格: # a. 过滤掉不符合条件的表格; # b. 创建同名的Excel工作表; # c. 获取该表格的字段名、类型、长度和注释信息; # d. 将...