MySQL存储过程简单记录

1. 基本格式 

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN
  select id;
  select uname into name from t_user where uid = id;
end;

 drop ...  create...  类似oracle中的 create or replace ...;

 入参和出参格式为:in/out 参数名 参数类型;

 在BEGIN .. END中间写过程的具体内容

2. 调用方法

call p_test(1,@name);
select @name;

存储过程的调用方法是: call 过程名(入参值,@出参名);

如果有出参,通过select 可以查看过程的返回值

3. 变量声明与赋值

BEGIN
  declare v_uid int default 1;
  set v_uid = 999;
  select v_uid;
END;

变量声明: declare 变量名  变量类型;

如果有默认值则在类弄后面加上 default 默认值;

变量赋值使用 set 变量名 = 值;

类似打印输出的功能,使用select

4.游标的使用

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN

  declare v_uid int;
  declare v_uname VARCHAR(100);
  declare v_done int default 0; -- 游标退出标志 
  declare cur_t_user cursor for (select uid,uname from t_user); -- 声明游标
  declare continue handler for not found set v_done = 1; -- 声明游标退出时动作
  
  open cur_t_user; -- 打开游标
  loop_user:loop -- 循环
	  fetch cur_t_user into v_uid,v_uname; -- 遍历
		if v_done = 1 then 
			leave loop_user;
		end if;
		select CONCAT(v_uid,'#',v_uname);
	end loop;
  close cur_t_user; -- 关闭游标
END;

游标声明和普通变量一样,declare 游标名 cursor for (游标内容);

在声明完游标后紧接着声明游标查不到内容时的动作,用来退出循环;

使用游标时,open ...close;

这里使用有loop循环的方式,也可以用其它方式,比如while只要能将游标内容遍历即可;

这种loop的方式,loop_user : loop ...  end loop; 其中loop_user是loop的标签,用以区分不同的loop,退出loop时也会用到 leave loop_user;

如果在游标中嵌套游标记得将内层游标写在begin..end内

 游标嵌套的例子

drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN

  declare v_uid int;
  declare v_uname VARCHAR(100);
  declare v_done int default 0; 
  declare cur_t_user cursor for (select uid,uname from t_user); 
  declare continue handler for not found set v_done = 1; 
  
  open cur_t_user; 
    loop_user:loop 
    fetch cur_t_user into v_uid,v_uname; 
      if v_done = 1 then 
        leave loop_user;
      end if;
    select CONCAT(v_uid,'#',v_uname);

      BEGIN
        declare v_done_inner int default 0;
        declare v_ret varchar(200) default '***';
        declare v_uid_inner int;
        declare cur_user_inner cursor for (select uid from t_user);
        declare continue handler for not found set v_done_inner = 1;
        
        open cur_user_inner;
          loop_user_inner:LOOP
            fetch cur_user_inner into v_uid_inner;
             if v_done_inner = 1 then
							 leave loop_user_inner;
						 end if;
             set v_ret = CONCAT(v_ret,'#',v_uname,'#',v_uid_inner);
          END LOOP;
        close cur_user_inner;
        select v_ret;
      END;
    end loop;
  close cur_t_user;
END;

5. 在命令行中使用大段SQL

mysql> DELIMITER //
drop procedure if exists p_test;
create procedure p_test(in id int, out name VARCHAR(100))
BEGIN
  select id;
  select uname into name from t_user where uid = id;
end;//
DELIMITER;
mysql> 

使用 DELIMITER // .. // DELIMITER ;  作为标记,就可以命令行模式下使用大段SQL 不至于被当做单条SQL执行。


有oracle基础的可以参考下 http://www.cnblogs.com/HondaHsu/p/3641258.html





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值