可以执行多行sql语句的集合,叫做存储过程
储存过程(Stored Procedure)是在大型数据库中,一组为了完成特定功能的sql语句集,储存在数据库中,经过一次编译后就不需要在编译了,用户通过指定储存过程的名字并给出参数(如果该储存过程带有参数)来执行他,存储过程是数据库中一个重要的对象
基本使用
创建储存过程
-- 创建存储过程
create procedure myproc1()
begin
-- 写入sql语句
insert into tb_user values (null,'小王','123',now());
-- 查询插入的id号
select last_insert_id() from tb_user;
end;
调用储存过程
-- 调用produce
call myproc1();
查看当前数据库中储存过程
show procedure status where Db='db001';
查看储存过程的相信内容
show create procedure myproc1;
变量的使用
在储存过程中声明一个局部变量
通过DECLARE声明局部变量
DECLARE _id int; -- 声明一个变量
DECLARE name varchar(50); -- 声明字符串变量
通过set进行赋值
set _id = _id +1;
也可以通过select...into赋值
select max(uid) from tb_user into _id;
储存参数变量
输入参数使用in进行定义
输出参数使用out进行定义
输入输出参数使用inout进行定义
create procedure register(in myname varchar(50),in pwd varchar(50),out myid int)
begin
-- 查询最大值
select max(uid) from tb_user into myid;
-- uid自增
set myid=myid+1;
-- 插入数据
insert into tb_user values (myid,myname,pwd,now());
end;
-- 调用带参数的存储过程
call register('小红花话','456',@newId);
select @newId;
存储过程的语法
if的基本使用
create procedure testif(in age int)
BEGIN
if age>18 then
select '可以去网吧';
elseif age=18 then
select '刚好18岁,你看着办';
else
select '不可以去网吧';
end if;
END;
-- 调用存储过程
call testif(21);
完整的注册功能
create procedure register(in myname varchar(50),in pwd varchar(50),out myid int)
begin
declare cnt int;
-- 查找数量
select count(*) from tb_user into cnt;
if cnt >0
then
-- 查询最大值
select max(uid) from tb_user into myid;
-- uid自增
set myid=myid+1;
else
set myid=1;
end if;
-- 插入数据
insert into tb_user values (myid,myname,pwd);
end;
循环的用法
while循环的使用
-- 测试创建while
create procedure testWhile(in age int)
begin
-- 声明一个局部变量作为循环的条件
DECLARE cnt int default 10;
while cnt>0
do
set age = age+1;
set cnt = cnt-1;
end while;
select age;
end;
loop循环使用
create procedure testLoop(in age int)
BEGIN
loop_1:loop
-- 设置循环退出条件
if age > 20 then
leave loop_1; -- 退出循环1
end if;
set age = age+1;
select '又长大了一岁';
end loop;
select age;
end;
call testLoop(10);
jdbc中调用储存过程
在java中使用CallStatement进行调用
Connection conn = DruidDBUtil.getConn();
CallableStatement ps =null;
//创建预编译
try {
ps = conn.prepareCall("call register(?,?,?)");
//设置输入参数
ps.setString(1,"大黄");
ps.setString(2,"444");
//设置输出参数
ps.registerOutParameter(3, Types.INTEGER);
//执行存储过程
ps.executeUpdate();
//获取输出参数
int id = ps.getInt(3);
System.out.println("新插入的id:"+id);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
DruidDBUtil.close(conn,ps,null);
}