原文地址: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. 洛谷 P1376 机器工厂 题解

    P1376 机器工厂 题目描述 小T开办了一家机器工厂,在N(N<=10000)个星期内,原材料成本和劳动力价格不断起伏,第i周生产一台机器需要花费Ci(1<=Ci<=5000)元. ...

  2. 《自制编程语言--基于C语言 郑钢》学习笔记

    <自制编程语言>学习笔记 本仓库内容 <自制编程语言>源码 src/sparrow.tgz <自制编程语言>读书笔记 docs/* <自制编程语言>样章 ...

  3. socket.error: [Errno 9] Bad file descriptor

    这个错误很明显 ,是因为你关闭了套接字对象后,又再次去调用了套接字对象,此时套接字链接已经被关闭,你不能再去调用,所以才会出现这种错误,复查一下自己的代码,很快就可以解决. 参考: https://b ...

  4. mysql5.6源码部署

    一.准备环境 环境:centos-7.3 一台软件版本:mysql-5.6.39 1.安装依赖yum -y install autoconf libaio bison ncurses-devel 2. ...

  5. Java 面向对象(十五)

    Lambda表达式 1. 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"拿什么东西做什么事情".相对而言,面向对象过分强调"必须通过对象的 ...

  6. Mysql sql_mode设置 timestamp default 0000-00-00 00:00:00 创建表失败处理

    往数据库里创建新表的时候报错: [Err] 1067 - Invalid default value for 'updateTime' DROP TABLE IF EXISTS `passwd_res ...

  7. google镜像《转》

    最新谷歌镜像列表 https://jsproxy-demo.ml 谷歌镜像F1http://go.yuxuantech.com 谷歌镜像F1,非SSLhttps://www.siwa88.net 谷歌 ...

  8. Bayesian Statistics for Genetics | 贝叶斯与遗传学

    Common sense reduced to computation - Pierre-Simon, marquis de Laplace (1749–1827) Inventor of Bayes ...

  9. VS2010专业版和旗舰版(中文版)下载

    本文转载自https://blog.csdn.net/chy2z/article/details/80080399 注意: 中文版为iso镜像文件,使用 Daemon Tools 虚拟光驱软件载入进行 ...

  10. 原理分析dubbo分布式应用中使用zipkin做链路追踪(转)

    作者:@nele本文为作者原创,转载请注明出处:https://www.cnblogs.com/nele/p/10171794.html 目录 zipkin是什么为什么使用Zipkinzipkin架构 ...