mysql存储过程中使用游标
用户变量一般以@开头,作用于全局范围
局部变量需用 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 ;
mysql存储过程中使用游标的更多相关文章
- mysql 存储过程中使用游标中使用临时表可以替代数组效果
mysql不支持数组.但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,mysql临时表可以解决这个问题.临时表:只有在 ...
- Mysql 存储过程中使用多游标
Mysql 存储过程中使用多游标 drop procedure IF EXISTS test_proc_1; create procedure test_proc_1() begin ; ) ; ) ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- MYSQL存储过程中常使用的命令记录
MYSQL存储过程中常使用的命令记录 1.触发器trigger 查看:show triggers; 2.存储过程procedure 查看:show procedure status; 查看详细:sho ...
- MYSQL存储过程中的IN、OUT和INOUT
MYSQL存储过程中的IN.OUT和INOUT,不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的. 一.MySQL 存储过程参数(in) 基本可以理解为传入function的参数,而 ...
- MySQL存储过程中使用SELECT …INTO语句为变量赋值
使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT …INTO语句 ...
- 【转】MySQL存储过程中使用动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- mysql -- 存储过程中 declare 和 set 定义变量的区别
mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...
- mysql存储过程中 乱码问题解决办法
中文乱码无论在何时都是一个头疼的问题,mysql的存储过程参数也同样存在这个问题.1.直接使用insert into语句没问题,能够正常插入汉字.2.把insert into语句移到Procedure ...
随机推荐
- Day1-Request/BeautifulSoup
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...
- (转)UCOSII在任务切换与出入中断时堆栈指针的使用
1 uc/os ii在M3中的堆栈结构 1.1 M3入账序列 1.2 加上手工入栈序列 2 PendSV在Cortex-M3中的应用 Systick为嵌入到内核中,优先级比一般中断优先级高.若在一 ...
- HTTP Status 405 - HTTP method GET is not supported by this URL
问题概述: 借助MyEclipse直接建立了一个Servlet类,每次访问这个Servlet都能访问.可自己建立一个Servlet为什么总提示:HTTP Status 405 - HTTP metho ...
- 20171104xlVBA制作联合成绩条
Dim dGoal As Object Dim dCls As Object Sub 制作联合成绩条() Dim sht As Worksheet Dim HeadRng As Range Dim H ...
- Linux下安装 jdk
转自 http://www.cnblogs.com/shihaiming/p/5809553.html 0.下载jdk8 登录网址:http://www.oracle.com/technetwork/ ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 后缀自动机在tire树上拓展
题意:有棵树每个点有个颜色(不超过10种),每个节点不超过20个儿子,问你每两点之间的颜色序列不同的有多少种 题解:先建出树,对于每个叶子节点,bfs一遍建在sam上,每次保留当前点在sam上的位置, ...
- centos7 keepalived+nginx实现vip漂移高可用
一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...
- vue项目 sockjs-node一直报错问题
vue3下 vue.config.js中 devServer: { host: '0.0.0.0', port: 8080, proxy: { '/': { target: 'http://127.0 ...
- php自动填充
1.str_pad() 函数把字符串填充为新的长度. 2.str_pad(string,length,pad_string,pad_type) 参数 描述 string 必需.规定要填充的字符串. l ...
- SecureCRT自动记录日志
From: http://lzj0470.iteye.com/blog/1189368 今天在推特上看到有人谈起SecureCRT日志记录的问题,貌似很多人都有这习惯 我是开始工作后才使用Secure ...