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

请使用 mysql 1.5 或以上version;
测试表 level ;
create table test.level (name varchar(20));
再 insert 些数据 ;

  /* 初始化 */  
 
drop   procedure   if   exists   useCursor  //     
 
 
/* 建立 存储过程 create  */  
 
CREATE   PROCEDURE  useCursor()
    
BEGIN
    
/* 局部变量的定义 declare */  
         
declare  tmpName  varchar ( 20 default   ''  ;
         
declare  allName  varchar ( 255 default   ''  ;
         
         
declare  cur1  CURSOR   FOR   SELECT  name  FROM  test. level  ;
         
         
/*     mysql 不知道为什么用异常加入判断 ?
          *    此请参考官方文档
20.2.11. 光标 光标 
          *        这把 游标 异常后 捕捉 
          *        并设置 循环使用 变量 tmpname 为 null 跳出循环。
          
*/
         
declare   CONTINUE  HANDLER  FOR  SQLSTATE  ' 02000 '   SET  tmpname  =   null ;
    
    
    
/* 开游标 */  
     
OPEN  cur1;
         
/* 游标向下走一步 */  
         
FETCH  cur1  INTO  tmpName;
         
         
/*  循环体 这很明显 把游标查询出的 name 都加起并用 ; 号隔开  */
      
WHILE  ( tmpname  is   not   null ) DO
          
set  tmpName  =  CONCAT(tmpName ,";") ;
         
set  allName  =  CONCAT(allName ,tmpName) ;
        
/* 游标向下走一步 */  
        
FETCH  cur1  INTO  tmpName;
      
END   WHILE ;
  
    
CLOSE  cur1;
    
    
select  allName ;
END ; //
call useCursor()
//
 

运行结果:
mysql >  call useCursor() //
+ -- ------------------------------------+
|  allName                               |
+ -- ------------------------------------+
|  f1;c3;c6;c5;c2;c4;c1;f1;f3;f4;f2;f5;  |
+ -- ------------------------------------+
1  row  in   set  ( 0.00  sec)

 

三、示例

 

Sql代码   收藏代码
  1. drop procedure if exists add_test;  
  2. # 创建存储过程 add_test  
  3.   
  4.   
  5. CREATE PROCEDURE add_test()  
  6.   
  7.     BEGIN  
  8.            #定义 变量  
  9.   
  10.   
  11.            DECLARE a int;  
  12.            DECLARE b VARCHAR(30);  
  13.              
  14.            #此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道  
  15.   
  16.   
  17.            DECLARE str VARCHAR(300);  
  18.            DECLARE x int;  
  19.              
  20.            #这个用于处理游标到达最后一行的情况  
  21.   
  22.      
  23.            DECLARE s int default 0;  
  24.              
  25.            #声明游标cursor_name(cursor_name是个多行结果集)  
  26.   
  27.   
  28.            DECLARE cursor_name CURSOR FOR select id ,name from from_data;  
  29.              
  30.            #设置一个终止标记   
  31.   
  32.     
  33.            DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;  
  34.   
  35.   
  36.             set str = "--";  
  37.                 #打开游标  
  38.   
  39.   
  40.                 OPEN cursor_name;  
  41.                       
  42.                     #获取游标当前指针的记录,读取一行数据并传给变量a,b  
  43.   
  44.   
  45.                     fetch  cursor_name into a,b;  
  46.                     #开始循环,判断是否游标已经到达了最后作为循环条件   
  47.   
  48.   
  49.                     while s <> 1 do  
  50.                             set str =  concat(str,x);  
  51.   
  52.                             insert into to_data(id,namevalues(a,b);  
  53.                             #读取下一行的数据  
  54.   
  55.     
  56.                             fetch  cursor_name into a,b;  
  57.                       
  58.                     end while;  
  59.                    
  60.                  #关闭游标  
  61.   
  62.   
  63.                  CLOSE cursor_name ;  
  64.               
  65.             select str;  
  66.                
  67.     #语句执行结束  
  68.   
  69.   
  70.     END;  
  71.       
  72.     #调用存储函数add_test  
  73.   
  74.   
  75.     CALL add_test()  
  

 

 

   四、补充-关于ssh上运行

 

         由于mysql的解释器默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,
     那么回车后,mysql将会执行该命令
,我们在此处有很多分号,这样很是不方便,这种情况下,我只需

     执行如下命令:

                   执行delimiter //

     即可把分号结束换成//结束,然后在换回

                  delimiter ;

好的,以下是一个使用Canvas实现樱花飘落的页面,代码中有注释解释每个部分的作用: ```html <!DOCTYPE html> <html> <head> <title>樱花飘落页面</title> <style> body { margin: 0; padding: 0; background-color: #f9d2e9; } </style> </head> <body> <canvas id="canvas"></canvas> <script> // 获取canvas元素 var canvas = document.getElementById("canvas"); // 设置canvas大小为屏幕大小 canvas.width = window.innerWidth; canvas.height = window.innerHeight; // 获取画布上下文 var ctx = canvas.getContext("2d"); // 定义樱花花瓣数组 var sakuras = []; // 定义樱花花瓣类 function Sakura(x, y, r, vx, vy) { this.x = x; this.y = y; this.r = r; this.vx = vx; this.vy = vy; this.alpha = 1; this.color = "#FFC0CB"; } // 定义樱花花瓣渲染方法 Sakura.prototype.render = function() { ctx.beginPath(); ctx.globalAlpha = this.alpha; ctx.fillStyle = this.color; ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2); ctx.fill(); } // 定义樱花花瓣更新方法 Sakura.prototype.update = function() { // 计算新位置 this.x += this.vx; this.y += this.vy; // 计算新透明度 this.alpha -= 0.01; // 如果透明度小于等于0,就从数组中删除 if (this.alpha <= 0) { sakuras.splice(sakuras.indexOf(this), 1); } } // 定义樱花花瓣生成函数 function createSakura() { // 随机生成樱花花瓣的位置、大小和速度 var x = Math.random() * canvas.width; var y = -50; var r = Math.random() * 10 + 10; var vx = Math.random() * 2 - 1; var vy = Math.random() * 2 + 1; // 创建新的樱花花瓣对象并添加到数组中 var sakura = new Sakura(x, y, r, vx, vy); sakuras.push(sakura); } // 定义动画函数 function animate() { // 清空画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 每隔一段时间生成新的樱花花瓣 if (Math.random() > 0.9) { createSakura(); } // 遍历每个樱花花瓣,更新位置并渲染 for (var i = 0; i < sakuras.length; i++) { var sakura = sakuras[i]; sakura.update(); sakura.render(); } // 循环调用动画函数 requestAnimationFrame(animate); } // 启动动画函数 animate(); </script> </body> </html> ``` 这个页面使用Canvas实现了樱花花瓣的飘落效果,每隔一段时间会随机生成新的花瓣,并使用透明度和速度控制花瓣的位置和渲染。通过循环调用动画函数,使得花瓣会不断地飘落,营造出樱花飞舞的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值