mysql简单存储过程入门示例与java调用
? ?昨天看了一篇介绍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.htmlhttp://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? 这里啰嗦一句,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; deallocate prepare msql; while var? 测试
?
call proc_mysql_createtb_insert_data(10);select * from mysql_employee;
mysql存储过程想要修改时只能先删除在新建,删除方法为:
drop procedure proc_mysql_getsum_bywhile
查看某个数据库下面的存储过程方法为:
select name from mysql.proc where db='test'
如果想和oracle存储过程一样返回游标,怎么写呢,很遗憾,我所知道的是mysql不支持out ref_cur cursor之类的写法的,你可以在存储过程中新建临时表,结束时候删除临时表,方法请参考上面的新建表示例。
另一种方法是直接select 内容,不写返回结果,如下所示:
create procedure proc_mysql_return_cursor_method() beginselect * from user_t2;end;
? 测试方法为:
?
call proc_mysql_return_cursor_method();
? 下面我简单介绍下java中怎么调用mysql存储过程,如果不感兴趣可以不用往下看了。
? 首先是公共方法:
?
public connection getmysqlconnection() { string driver = com.mysql.jdbc.driver; string url = jdbc:mysql://localhost:3306/test;// 要操作的数据库名称 string username = root;// 数据库用户名 string password = 123;// 密码 return getconnection(driver, url, username, password); } public connection getconnection(string driver, string url, string username, string passwd) { connection conn = null; try { class.forname(driver); conn = drivermanager.getconnection(url, username, passwd); } catch (exception e) { e.printstacktrace(); } return conn; }
我就以我写的while循环为例,输入int参数,输出int参数:
public void testmysqlprocedurertnint(connection con, callablestatement cs, int limit) throws exception { cs = con.preparecall({call proc_mysql_getsum_bywhile(?,?)}); // 设置参数 cs.setint(1, limit); // 注册输出参数 cs.registeroutparameter(2, oracle.jdbc.oracletypes.integer); // 执行过程 cs.execute(); // 获取结果 int result = cs.getint(2); system.out.println(结果为: + result); }
输入int,输出varchar类型方法类似:
public void testmysqlprocedurertnvarchar(connection con, callablestatement cs, int id) throws exception { cs = con.preparecall({call proc_mysql_inout_test(?,?)}); // 设置参数 cs.setint(1, id); // 注册输出参数 cs.registeroutparameter(2, oracle.jdbc.oracletypes.varchar); // 执行过程 cs.execute(); // 获取结果 string result = cs.getstring(2); system.out.println(结果为: + result); }
? 来看下返回类似游标类型的调用:
?
public void testmysqlprocedurertncursor(connection con, callablestatement cs, resultset rs) throws exception { cs = con.preparecall({call proc_mysql_return_cursor_method()}); // 执行过程 rs = cs.executequery(); system.out.println(id + \t + username + \t + passwd); while (rs.next()) { system.out.println(rs.getint(1) + \t + rs.getstring(2) + \t + rs.getstring(3)); } }
? 很简单吧。
? 上面的介绍到目前为知该结束了,本文系原创,转载请注明出处,谢谢。
全文完。
?
