原文地址: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. 虚拟环境安装及Hello World

    学习文章引自:  http://www.pythondoc.com/flask-mega-tutorial/helloworld.html 1.安装项目需要的工具包 pip install flask ...

  2. Vim初学

    实现G++编译 1,首先下载安装MinGW,下载地址在http://sourceforge.net/projects/mingw/.这个是边下载边安装的,下载完成即安装完成.我的安装目录是G:\Min ...

  3. 28、对多次使用的RDD进行持久化或Checkpoint

    一.图解 二.说明 如果程序中,对某一个RDD,基于它进行了多次transformation或者action操作.那么就非常有必要对其进行持久化操作,以避免对一个RDD反复进行计算. 此外,如果要保证 ...

  4. vue指令大全~~~

    是的,这里有很全的vue指令使用~ 1.简单的vue应用 vue作为一个mvvm框架,想想为什么叫做mvvm? Model是负责数据的存储, View负责页面的展示 Model View 负责业务逻辑 ...

  5. 小福bbs-冲刺日志(第二天)

    [小福bbs-冲刺日志(第二天)] 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 UI重构完成 作业的正文 小福bbs-冲刺日志(第二天) ...

  6. Shell同步数据到oracle数据库

    某数据库有几张表更新,本地数据库增量更新数据,用脚本定时执行实现. 由于无blob/clob字段,使用sqlldr导入数据:查询目的数据库,以"|"分割导出所有数据,保存在./da ...

  7. Spark(四十八):Spark MetricsSystem信息收集过程分析

    MetricsSystem信息收集过程 参考: <Apache Spark源码走读之21 -- WEB UI和Metrics初始化及数据更新过程分析> <Spark Metrics配 ...

  8. taocrypt

    taocrypt MySQL Bugs: #25189: mysqld: coding.cpp:243: void TaoCrypt::Base64Decoder::Decode(): Asserti ...

  9. 给div添加disabled属性

    <div id="CompanyId" name="CompanyId" type="select" ></div> ...

  10. MAC下快速打开指定目录(转)

    使用了这么长时间MAC,打开文件查找目录总是感觉还是不如windows来的爽快 1.通过快捷键搜索   command + 空格,输入关键词 2.通过控制台打开    1) 跳转到指定路径  cd  ...