mysql存储过程中使用游标

本文围绕MySQL数据库展开,介绍了用户变量和局部变量的定义,提及了多种数据类型。详细阐述了存储过程的创建、调用、查询和删除方法,还说明了游标在存储过程中的使用,包括声明、打开、获取数据和关闭等操作,同时讲解了游标嵌套的相关要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户变量一般以@开头,作用于全局范围

局部变量需用 declare 定义格式为 declare 变量名 数据类型 [default value];

mysql 数据类型有 int ,float,date,varchar(length)等

声明的顺序必须是 先声明变量,再声明游标、最后声明handler。

同一个存储过程中,一个游标的使用和两个游标的使用是一样的。

调用存储过程 call sp_name();

查询某数据库中全部存储过程 :

select name from mysql.proc where db='数据库名';

select routine_name from information_schema.routines where routine_schema='数据库名';

show procedure status where db='数据库名';

查看单个存储过程: show create procedure 数据库.存储过程名;

 

删除存储过程 :drop procedure 存储过程名

 

存储过程创建语句:

delimiter $$                                                          -- 定义语句结束标志为 $$, 默认结束标志是;

drop procedure if exists test.sp_example$$           -- 创建存储过程关键字  

create procedure test.sp_example()                     -- 创建存储过程具体内容:

begin                                                                     -- 存储过程内容以begin开始,end 结束。

declare _inner_code int;                                       --  声明 局部变量 及变量类型

declare _writedate date;

declare _done int default 1;                                  -- 声明 局部变量 、变量类型  及 变量默认值

declare c_cursor cursor for select inner_code,writedate from test.example group by inner_code,writedate;

                                                                             -- 声明游标名、游标所存储数据

-- 此处可继续申明第二个游标 : declare a_cursor cursor for select  ... from ...;

declare continue handle for not found set _done=0; --  当出现 not found 的错误时 continue 并将变量_done的值设置为0

start transaction;

open c_cursor;                                                     -- 打开游标

fetch c_cursor into _inner_code,_writedate;            

-- 获取当前游标指向的数据行赋值给变量_inner_code,_writedate,并将游标指向下一行

while _done do 

 

功能语句块

 

 fetch c_cursor into _inner_code,_writedate;

/* 获取当前游标指向的数据行赋值给变量_inner_code,_writedate,并将游标指向下一行,当游标已经指向最后一行时会造成游标溢出. mysql 中游标溢出时会引发mysql预定义的not found 错误,在上面定义了一个continue属性的操作handle,当出现not found 错误时 继续,并修改_done变量的值为0,使循环结束*/

end while ;

close c_cursor ;                                                  --  关闭游标

end $$

delimiter ;                                                           -- 将结束标志定义回;

 

游标嵌套

在mysql中同一个error事件只能定义一次,如果多定义的话在编译时会提示 duplicate handler declared in the same block.

每个begin end 块都是一个独立的scope 区域,嵌套的游标可用begin end 包裹。

drop procedure if exists nest_use;

create procedure nest_use()

begin 

declare _n varchar(20);

declare done int default false;

declare cur cursor for select age from store group by age;

declare continue handler for not found set done =true;

open cur ;

read_loop:loop

fetch cur into _n;

if done then

       leave read_loop;

end if ;

begin

declare c int ;

declare n varchar(20);

declare total int default 0;

declare done int default false;

declare cur cursor for select name ,count from store where name='iphone';

declare continue handler for not found set done=true;

set total=0;

open cur ;

iphone_loop:loop

fetch cur into n ,c ;

if done then

leave iphone_loop;

end if ;

set total =tatal + c;

end loop;

close cur;

select _n,n,total;

end;

begin  

declare c int;  

declare n varchar(20);  

declare total int default 0;  

declare done int default false;  

declare cur cursor for select name,count from store where name = 'android';  

declare continue HANDLER for not found set done = true;  

set total = 0; 

open cur; 

android_loop:loop 

fetch cur into n,c; 

if done then  

leave android_loop; 

end if;  

set total = total + c;

end loop;  

close cur;  

select _n,n,total; 

end;  

end loop;

close cur;

end ;

      

转载于:https://www.cnblogs.com/Ting-light/p/9548356.html

MySQL存储过程中,游标(Cursor)是一种用于处理查询结果集的机制,特别适用于需要逐行操作的场景。游标通常用于复杂的数据处理逻辑,例如逐条更新记录、批量插入或条件判断。 ### 游标的基本使用方法 游标的基本使用流程包括声明游标、打开游标、读取游标数据以及关闭游标。在存储过程中,可以通过 `DECLARE` 语句定义游标,并通过 `OPEN`、`FETCH` 和 `CLOSE` 语句进行操作。以下是一个简单的游标使用示例: ```sql DELIMITER $$ CREATE PROCEDURE example_cursor() BEGIN DECLARE v_agent_account_id VARCHAR(255); DECLARE done INT DEFAULT 0; -- 声明游标 DECLARE cur1 CURSOR FOR SELECT agent_account_id FROM agent_account_info WHERE parent_id IS NOT NULL; -- 声明游标结束标志 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 打开游标 OPEN cur1; -- 开始循环读取游标数据 read_loop: LOOP FETCH cur1 INTO v_agent_account_id; -- 如果没有更多数据,则退出循环 IF done = 1 THEN LEAVE read_loop; END IF; -- 在此处执行业务逻辑,例如输出或更新数据 SELECT v_agent_account_id; END LOOP; -- 关闭游标 CLOSE cur1; END$$ DELIMITER ; ``` 在上述示例中,游标 `cur1` 用于从 `agent_account_info` 表中读取 `parent_id` 不为空的 `agent_account_id` 值。通过 `FETCH` 语句将结果逐行提取到变量 `v_agent_account_id` 中,并在循环中执行相关操作。 ### 游标的嵌套使用 在复杂业务场景中,可能需要使用嵌套游标来处理多层数据。嵌套游标的基本结构与单层游标类似,但需要注意内部游标的声明和使用应在外部游标的循环体内进行。以下是一个双层嵌套游标的示例: ```sql DELIMITER $$ CREATE PROCEDURE nested_cursor() BEGIN DECLARE v_agent_account_id_outer VARCHAR(255); DECLARE v_agent_account_id_inner VARCHAR(255); DECLARE done_outer INT DEFAULT 0; DECLARE done_inner INT DEFAULT 0; -- 声明外部游标 DECLARE outer_cursor CURSOR FOR SELECT agent_account_id FROM agent_account_info WHERE grandpa_id IS NOT NULL; -- 声明内部游标 DECLARE inner_cursor CURSOR FOR SELECT agent_account_id FROM agent_account_info WHERE parent_id = v_agent_account_id_outer; -- 外部游标结束标志 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_outer = 1; -- 打开外部游标 OPEN outer_cursor; outer_loop: LOOP FETCH outer_cursor INTO v_agent_account_id_outer; IF done_outer = 1 THEN LEAVE outer_loop; END IF; -- 打开内部游标 OPEN inner_cursor; inner_loop: LOOP FETCH inner_cursor INTO v_agent_account_id_inner; IF done_inner = 1 THEN LEAVE inner_loop; END IF; -- 在此处执行内部游标的业务逻辑 SELECT v_agent_account_id_inner; END LOOP; -- 关闭内部游标 CLOSE inner_cursor; END LOOP; -- 关闭外部游标 CLOSE outer_cursor; END$$ DELIMITER ; ``` 在上述示例中,外部游标 `outer_cursor` 用于读取 `grandpa_id` 不为空的 `agent_account_id`,而内部游标 `inner_cursor` 则基于外部游标的值读取对应的 `parent_id` 数据。 ### 游标的注意事项 1. **游标的声明顺序**:游标必须在变量声明之后、处理程序声明之前进行声明。 2. **游标结束标志**:通过 `DECLARE CONTINUE HANDLER FOR NOT FOUND` 设置游标结束标志,避免无限循环。 3. **性能影响**:由于游标逐行处理数据,可能会导致性能下降,因此在处理大数据量时应谨慎使用。 4. **嵌套游标的范围**:内部游标使用应限制在外部游标的循环体内,确保逻辑清晰。 ### 游标的实际应用场景 游标通常用于以下场景: - 数据清洗或批量更新操作。 - 复杂的业务逻辑处理,例如多层嵌套查询。 - 需要逐行处理数据的表生成或日志记录。 通过合理使用游标,可以更灵活地处理存储过程中的复杂数据操作需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值