`
石头的日记
  • 浏览: 200772 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

简简单单储存过程——循环一个select结果集

阅读更多

 摘要:本文主要讲解了存储过程的创建、调用、以及游标的使用 ,相信掌握了游标      会对你有不错的帮助,有不足之处还请指教

 

导航 : 一、存储过程的创建及调用

            二 、游标的使用

            三、  示例

            四、补充

 

说明:

        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、定义游标

 /*
     定义游标的关键字:CURSOR。
     定义游标cursor_name,
     游标cursor_name当前指针的记录
     是一个表from_data的多行结果集
  */
   DECLARE cursor_name CURSOR FOR select id,name

 from from_data;
 

 

 

       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 ;

 

  • 描述: from_data表结构图
  • 大小: 14.8 KB
  • 大小: 14.9 KB
4
1
分享到:
评论
1 楼 ocaicai 2013-04-24  
简洁明了,写得真好啊

相关推荐

    简简单单——购物系统

    【标题】"简简单单——购物系统"是一个基础的在线购物平台项目,旨在提供一个简易的电子商务体验。这个系统可能是由初学者或者爱好者创建的,目的是为了学习和实践Web开发技术,同时也表达了作者希望得到资深开发者...

    一个简简单单的计算器

    例如,当用户输入“4 + 5 =”,程序会先存储“4”作为第一个操作数,再存储“+”作为运算符,然后存储“5”作为第二个操作数,最后计算出结果并显示在文本框中。 ### 4. 特殊功能:清除和平方根 除了基本的四则...

    JJDD-Guestbook(简简单单留言本).7z

    "JJDD-Guestbook(简简单单留言本).7z" 是一个包含源代码的压缩包,它为我们提供了一个简单的在线留言本的实现。在本文中,我们将深入探讨这个留言本的实现原理、主要功能以及可能涉及的技术点。 首先,源码通常是...

    简简单单清除系统lj

    简简单单清除系统lj 可执行文件 .bat

    简简单单的Java面试题一个

    Java面试题题目一个,仅供学习参考

    简简单单的C实例

    例如,我们可以定义一个求和函数,接收两个整数作为参数,返回它们的和。 数组和指针是C语言的特色。数组是一组相同类型的数据的集合,可以一次性处理多个元素。指针则是存储内存地址的变量,通过指针,我们可以...

    商业模式——裂变营销[参照].pdf

    商业模式——裂变营销 裂变营销是指通过某种方式或者机制,激发客户传播产品或服务的商业模式。在这篇文章中,我们将探讨裂变营销的重要性和实施方法。 首先,产品是 1,营销模式是 0。如果没有前面的好产品做 1,...

    win10卸载edge的简简单单工具

    标题中的“win10卸载edge的简简单单工具”指的是在Windows 10操作系统中,用户想要卸载预装的Microsoft Edge浏览器。通常,Windows系统内置的应用程序并不容易通过常规的控制面板或设置菜单卸载,特别是Edge,因为它...

    swift-一个简简单单的状态栏显示器

    在这个特定的项目"swift-一个简简单单的状态栏显示器"中,我们关注的是如何在iOS应用中创建一个简洁的状态栏显示器。状态栏通常用于显示设备的相关信息,如时间、电池状态以及网络连接情况,而这个项目则扩展了它的...

    基于PHP的J001 简简单单php留言本.zip

    【标题】"基于PHP的J001 简简单单php留言本.zip"是一个包含基本PHP编程技术的简易留言本应用。这个项目可能旨在帮助初学者了解如何使用PHP语言来开发互动式的Web应用程序,尤其是那些希望学习PHP基础的人。 【描述...

    简简单单人脸识别项目练手(原创

    "简简单单人脸识别项目练手(原创)"是一个旨在帮助初学者和爱好者通过实践来掌握人脸识别基本原理和应用的教程。在这个项目中,你将有机会训练自己的数据集,并学习如何根据这些数据识别不同的人脸。 首先,人脸...

    一个简简单单的面试题

    两者都能改变函数调用时的 `this` 指向,但`apply`接收一个数组或类数组对象作为参数,而`call`则直接传递一组参数。在非严格模式下,若第一个参数为 `null`,`this` 指向全局对象 `window`,但在严格模式下,`this`...

    如何简简单单恢复你的系统.docx

    本文将重点介绍两款常用的一键还原软件——奇兔一键还原和一键还原精灵,并详细介绍它们的使用方法。 #### 二、奇兔一键还原 奇兔一键还原是一款永久免费的一键还原软件,具有以下特点: - **安装简便**:安装...

    PHP实例开发源码-J001 简简单单php留言本.zip

    【PHP实例开发源码-J001 简简单单php留言本.zip】是一个包含PHP编程实践的项目,主要用于教学和学习PHP基础以及如何构建一个简单的在线留言本系统。这个项目可能适合初学者,帮助他们了解PHP语言在实际web开发中的...

    简简单单的FTP server

    "简简单单的FTP server"指的是一个轻量级、易于部署和管理的FTP服务器软件,适合于程序开发测试环境。这种服务器通常体积小,安装快速,配置简单,能够满足开发者在测试阶段快速上传和下载文件的需求。 在程序开发...

    一个简简单单的,带图片功能的玉器用进销存

    【标题】"一个简简单单的,带图片功能的玉器用进销存"所涉及的知识点主要包括进销存管理软件的基本概念、图片功能在进销存中的应用以及绿色版软件的特点。 进销存管理系统是企业管理中不可或缺的一部分,主要用于...

    一个简简单单的猜年龄游戏

    #include using namespace std;...反正就是一个很简单的猜年龄游戏,用二分做的(做了好久好久好久)······ (很便宜的······) ······ ······ ······ return 0; }

    简简单单风格 for bbsxp 5.0

    这款“简简单单风格”可能是为了提供一个简洁、直观的界面,让用户在浏览和参与论坛讨论时更加舒适和高效。 【描述】"简简单单风格for bbsxp" 强调了设计的核心理念是简约。这通常意味着去除不必要的装饰元素,使...

    简简单单实现数据分页

    这个方法适用于小到中型的数据集,对于大型数据集,可能需要考虑更高效的分页算法,如SQL Server的ROW_NUMBER()函数或存储过程,以及缓存策略来进一步优化性能。 请参考“数据分页.txt”文件,其中可能包含了更详细...

Global site tag (gtag.js) - Google Analytics