??? ?昨天看了一篇介绍Mysql存储过程博客,链接如下:
???? http://my.oschina.net/u/1264926/blog/199831
???? 我试着运行了下,一直报错,找了很久才发现Mysql存储过程赋值要用SET 变量名 = 表达式值,很久没有Mysql存储过程,好多东西都忘光了,而是写了本篇博文备忘,我使用的数据库版本是Mysql 5.6.14,使用了Navicat Premium图形界面,首先是我参考的链接:
????
http://www.cnblogs.com/jevo/p/3271359.html http://phpzf.blog.51cto.com/3011675/793775
??? 下面开始介绍Mysql存储过程,语法之类的我就不写了,请自行谷歌,我的存储过程是完成1到limit之间的累加和,所以要用到循环,Mysql存储过程常用的循环语句有:While,Loop,Repeat,下面一一介绍怎么写:
??? (一)首先是使用While循环(WHILE……DO……END WHILE)
???
create procedure proc_mysql_getsum_bywhile(in v_limit int,out sum int) begin declare i int default 0; set sum=0; while i<v_limit do begin set sum=sum+i; set i=i+1; end; end while; /**select sum;**/ end
??? 这里啰嗦一句,Mysql里面没有类似Oracle的DBMS_OUT.PUT_LINE之类的打印语句,想打印结果,请用select 变量。
?? While循环测试:
???
set @limit=100; set @out=0; call proc_mysql_getsum_bywhile(@limit,@out); select @out
?? (二)repeat 循环(REPEAT……END REPEAT)
??
create procedure proc_mysql_getsum_byrepeat(in v_limit int,out sum int) begin declare i int default 0; set sum=0; repeat begin set sum=sum+i; set i=i+1; end; until i>v_limit end repeat; /**select sum;**/ end;
??? Repeat测试:
???
set @limit=100; set @out=0; call proc_mysql_getsum_byrepeat(@limit,@out); select @out
??? (三)loop循环
???
create procedure proc_mysql_getsum_byloop(in v_limit int,out sum int) begin declare i int default 0; set sum=0; loop_label:loop begin set sum=sum+i; set i=i+1; if i>v_limit then leave loop_label; end if; end; end loop; /**select sum;**/ end;
??? loop 测试:
???
set @limit=100; set @out=0; call proc_mysql_getsum_byloop(@limit,@out); select @out
??? 上面介绍的是一个简单的带输入输出的存储过程,下面在介绍一个getUserById的存储过程,和上面的差不多。
??
create procedure proc_mysql_inout_test(in v_id int,out username varchar(20)) begin select username into username from user_t2 where id = v_id; /**select username;**/ end;
??? in out参数测试:
??? Navicat查询界面测试:
???
call proc_mysql_inout_test(2,@out); select @out
??? 返回值很奇怪结果是Blob。
??
??? Navicat命令行下测试:返回的是gbk编码的字符串,而直接select * from user_t2;无乱码,如下所示:
???
??? cmd 命令行下测试 无乱码,如下所示:
???
??? 如果想在存储过程中执行sql语句该怎么写呢?请看示例:
????测试新建表并填充值:
???
drop PROCEDURE proc_mysql_createtb_insert_data; CREATE PROCEDURE proc_mysql_createtb_insert_data(IN loop_times INT) BEGIN DECLARE var INT DEFAULT 0; PREPARE MSQL FROM 'CREATE TABLE IF NOT EXISTS mysql_employee (id INT (10) NOT NULL AUTO_INCREMENT,empname VARCHAR (16) NOT NULL COMMENT ''名字'',hiredate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id)) ENGINE = INNODB DEFAULT CHARSET = utf8'; EXECUTE MSQL;