mysql存储过程的学习

本文介绍了一个使用MySQL存储过程实现1~100累加和的例子,并详细展示了如何创建和调用存储过程。此外,还提供了一个统计库表数量与获取前5条时间记录的复杂存储过程,涉及游标、条件句柄、动态SQL等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

体会循环,使用存储过程做1 ~ 100的累加和

create PROCEDURE p4(in count int, out result_sum int)
    BEGIN
            declare i int DEFAULT 0; -- 使用declare声明一个变量i,默认值是0
            DECLARE sum int;
            set sum = 0;    -- 使用set设置sum这个变量的值为0
            while i <= count DO
                set sum = sum + i;
                set i = i + 1;
            end WHILE;
            set result_sum = sum;    -- 设置result_sum = sum
    END
call p4(100, @he);
select @he;



show PROCEDURE status; -- 查看当前创建的存储过程

drop PROCEDURE p4;    -- 删除p4存储过程

这是统计库表的数量与前5条时间的存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `p4`(in tablename VARCHAR(2000), out result_sum VARCHAR(2000), out otime VARCHAR(20000))
BEGIN

declare v_sql varchar(500); 
declare v_sql1 varchar(500); 

  declare stopflag int default 0;
  declare my_uname varchar(3200) default '';
	declare time varchar(20000) default '';
	declare my_uname1 varchar(3200) default '';
  declare uname_cur CURSOR for 	SELECT COLUMN_NAME   FROM information_schema.COLUMNS WHERE  TABLE_NAME =tablename;
  #1 游标是保存查询结果的临时内存区域
  #2 游标变量uname_cur保存了查询的临时结果,实际上就是查询结果集
  declare continue handler for not found set stopflag=1;
  #3 声明句柄,当游标变量中保存的结果都查询一遍(遍历),到达结尾,就把变量stopflag设置为1 用于循环中判断是否遍历结束
  open uname_cur; # 打开游标
  fetch uname_cur into my_uname; # 游标向前走一步,取出一条记录放到变量my_uname中。
  while(stopflag=0) DO # 如果游标还没到结尾,就继续循环
  begin
    fetch uname_cur into my_uname;
		
				set v_sql1= CONCAT('SELECT COUNT(',my_uname,') into @count FROM ',tablename);
 
				set @v_sql1=v_sql1;
				prepare stmt1 from @v_sql1;
				EXECUTE stmt1;
				deallocate prepare stmt1;

		IF @count =0 THEN 
		SET my_uname1=CONCAT(my_uname,",",my_uname1);
		END IF;
		IF my_uname='i_time' THEN
				set v_sql= CONCAT('SELECT substring_index(GROUP_CONCAT(i_time),",","5")  INTO @time1 FROM ' , tablename,' ORDER BY i_time DESC LIMIT 0,5 ');
				set @v_sql=v_sql;
				prepare stmt from @v_sql;
				EXECUTE stmt;
				deallocate prepare stmt;
		END IF;
  end;
  end while;
  close uname_cur;

       set result_sum=  my_uname1;    -- 设置result_sum = sum
			 set otime=  @time1;  
			 
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值