简简单单储存过程——循环一个select结果集
原文地址:https://shitou521.iteye.com/blog/1069027
摘要:本文主要讲解了存储过程的创建、调用、以及游标的使用 ,相信掌握了游标 会对你有不错的帮助,有不足之处还请指教
导航 : 一、存储过程的创建及调用
二 、游标的使用
三、 示例
四、补充
说明:
1、用到的两个数据表:
from_data
to_data
2、示例需求 : 将表from_data 的select结果集循环插入到表 to_data;
伪代码:
while 循环 select id ,name from_data insert into to_data(id,name) value(from_data.id,from_data.name) end
3、环境: mysql
一、存储过程的创建及调用
我们创建一个名叫 add_test的存储过程
1 、检查是否有 add_test
drop procedure if exists add_test;
2、创建
create procedure add_test()
(
#[in|out|inout] 参数 datatype a int;
b int;
)
begin
#SQL 语句; end;
3、调用
call add_test(1,2 );
以上就是基本的创建方法,注意已下几点:
1 、在建立和调用时,add_test后面的“()”是必须的
2、MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”,并且参数不能指定默认值 。
3、包含多条 SQL 语句时,需要 begin end 关键字,在begin end里面的每条语句的末尾,都要加上分号 “;”
4、在begin end里面声明变量,使用关键字 DECLARE ,如:
begin #声明一个name变量,类型是varchar(记得分号)
name varchar(32);
end;
二 、游标的使用
1、定义游标
2、打开游标
#关键字:OPEN
OPEN cursor_name;
3、 获取游标
#声明两个变量
DECLARE a int ;
DECLARE b varchar(32) ; /*
FETCH 获取游标当前指针的记录,并传给指定变量 a 、b
*/
FETCH cursor_name INTO a,b;
注意:(1、此处很重要,我们在后面的循环例子中会详细讲解如何用,
(2、注意变量数必须与MySQL游标返回的字段数以及类型一致,请看2,3步的标红处,
a的类型对应 id,b类型对应name
4、关闭游标
CLOSE cursor_name ;
以上就是游标的常见使用方法,关键的部分我已在每一步中说明,就不在多说了,现在我们看下例子:
三、示例
drop procedure if exists add_test;
# 创建存储过程 add_test CREATE PROCEDURE add_test() BEGIN
#定义 变量 DECLARE a int;
DECLARE b VARCHAR(30); #此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道 DECLARE str VARCHAR(300);
DECLARE x int; #这个用于处理游标到达最后一行的情况 DECLARE s int default 0; #声明游标cursor_name(cursor_name是个多行结果集) DECLARE cursor_name CURSOR FOR select id ,name from from_data; #设置一个终止标记 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1; set str = "--";
#打开游标 OPEN cursor_name; #获取游标当前指针的记录,读取一行数据并传给变量a,b fetch cursor_name into a,b;
#开始循环,判断是否游标已经到达了最后作为循环条件 while s <> 1 do
set str = concat(str,x); insert into to_data(id,name) values(a,b);
#读取下一行的数据 fetch cursor_name into a,b; end while; #关闭游标 CLOSE cursor_name ; select str; #语句执行结束 END; #调用存储函数add_test CALL add_test()
四、补充-关于ssh上运行
由于mysql的解释器默认情况下,delimiter是分号; 。在命令行客户端中,如果有一行命令以分号结束,
那么回车后,mysql将会执行该命令 ,我们在此处有很多分号,这样很是不方便, 这种情况下,我只需
执行如下命令:
执行delimiter //
即可把分号结束换成//结束,然后在换回
delimiter ;
最新文章
- QPalette的用法
- 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
- BZOJ2208: [Jsoi2010]连通数
- svn更新报错:svn unable to connect to a repository at url
- Rocketmq-尝试理解
- 手机app常见bug积累
- Android请求返回417解决办法
- Android 模拟器中sdcard操作
- nyoj 199 无线网络覆盖
- Android Dialog 系统样式讲解及透明背景
- 游标的使用实例(Sqlserver版本)
- html5 js控制音乐播放
- eclipse工作空间的基本配置
- Java消息服务初步学习(基于Spring In Action的整理)
- 分布式数据中间件TDDL、Amoeba、Cobar、MyCAT架构比较
- ASP.MVC学习资源总结
- systemverilog的高亮显示
- node学习之cookie和session
- ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
- React Native开启实时重载(Enable live Reload)
热门文章
- jsp+ tinymce粘贴word
- 建立自己的键盘栈(shortcutkeyStack)
- A Comprehensive Evaluation of Approaches for Built-Up Area Extraction from Landsat OLI Images Using Massive Samples(landsat8建城区提取不同方法比较)
- leetcode 467. 环绕字符串中唯一的子字符串
- 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
- mac使用poetry
- 大数据学习之路之HBASE
- Python安装第三方库常用方法
- Python将多张图片进行合并拼接
- python 日期