`
石头的日记
  • 浏览: 198631 次
  • 性别: 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  
简洁明了,写得真好啊

相关推荐

Global site tag (gtag.js) - Google Analytics