原文地址: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 ;

简简单单储存过程——循环一个select结果集的更多相关文章

  1. thinkphp调用sqlserver储存过程返回多个结果集

    首先安装扩展 windows 分为两个步骤 找到对应自己PHP版本的pdo扩展,下载解压出来,并且在php.ini里面启用扩展,需要注意的问题是php版本以及是否为安全版本 下载 ODBC Drive ...

  2. MySQL 储存过程-原理、语法、函数详细说明

    Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...

  3. Sql Server分页储存过程

    --分页储存过程if exists (select * from sys.procedures where name='Page')drop proc Pagegocreate proc Page@P ...

  4. 从一个例子入门Mysql储存过程

    例子 -- 秒杀执行存储过程 DELIMITER $$ -- 将分隔符; 转换为 $$ -- 定义存储过程 -- 参数: in 输入参数; out 输出参数 -- row_count():返回上一条修 ...

  5. MySQL储存过程

    储存过程 本文章原创,转载需注明出处. 前提: 在大型数据库中 来源: 为了完成特定功能的SQL语句集 定义: 储存在数据库中, 用户通过指定储存过程的名字并给出参数(带有参数的)来执行它 声明: 储 ...

  6. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  7. Sqlserver中的储存过程

    一.什么是存储过程(Stored Procedure) 存储过程是一段存储在数据库的“子程序”,本质是一个可重复使用的SQL代码块,可以理解为数据库端的“方法”. 存储过程的好处: ①提高性能:由于数 ...

  8. C#函数与SQL储存过程

    一点点小认识作为memo,求指正. C#的函数与SQL的储存过程有很多的相似性, 它们都是一段封闭的代码块,来提高代码的重用性,虽然现在复制粘贴很方便,但是我们在写多个函数的时候频繁的复制粘贴相同的内 ...

  9. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

随机推荐

  1. A tow-day exam

    D1 T1l \(des:\) 给出一棵树,判断树上两条路径是否相交 \(sol:\) 判断其中一条路径的两个端点以及两端点的 \(lca\) 是否存在于另一条链上 由于这是一棵树,任一点为根后这样判 ...

  2. pyy整队 线段树

    pyy整队 线段树 问题描述: 众所周知pyy当了班长,服务于民.一天体育课,趁体育老师还没来,pyy让班里n个同学先排好 队.老师不在,同学们开始玩起了手机.站在队伍前端玩手机,前面的人少了,谁都顶 ...

  3. Vim颜色配置

    最近迷上了Vim 主要原因是可以装逼 不过话说它自带的配色里面也就只有一个evening能勉强满足我的审美 于是我花了大概几天的时间翻了些百度贴吧,或者自己手动改属性后面的配色来实验这个属性到底对应哪 ...

  4. (32)Vue模板语法

    模板语法 文本: <span>Message: {{ msg }}</span> v-once 一次性地插值,当数据改变时,插值处的内容不会更新 <span v-once ...

  5. 记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题

    记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题 前端开发中会经常涉及清理缓存的事情. 在一次开发后, 需要清理缓存,一个哥们怎么清理都不生效, 于是向我求救. 在我看了下后 ...

  6. LoadRunner学习目录

    已更新: 未更新: 1.loadrunner 11破解版及破解包 2.如何录制一个LR脚本 3.自定义loadrunner脚本

  7. 部署Django到云服务器(centos+nginx+mysql+uwsgi+python3)【操作篇(1)】

    开篇 笛卡尔说:"你不能教会一个人任何东西,你只能帮助他发现他自己内心本来就有的东西!" jacky能教你的,只能是经验和建议,要逆袭还得通过自己对数据的不断领悟,数据领域的技能都 ...

  8. MySQL UPDATE 更新

    以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [W ...

  9. 部署Hadoop集群之前的一些系统配置

    修改内核参数 在/etc/sysctl.conf文件中添加如下配置(需要root权限)以下参数的默认值是在centos7下查看的fs.file-max = 6815744 //文件描述符总数,默认值: ...

  10. 常用spaceclaim脚本(二)

    #创建一个草图 #第一个参数传入一个Frame对象 #通过一个点和两个向量创建Frame #Frame的类成员函数Create被重载 #重载函数1:Frame.Create(Point, Direct ...