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
时间: 2024-10-12 06:13:44