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