获取刚存入的评论id
set pid =(select last_insert_id());
mysql变量:
(1)用户变量:用户自己定义的变量
a)定义:以@开始,形式:@变量名//@a
b)赋值:set @a = 10;
c)作用范围:整个客户端,当客户端退出时,用户变量消失,所以也叫会话变量
d)访问:select @a;
(2)局部变量:
a)定义:declare b int;//没有default设置value值时,默认值是Null
declare c int default 10;
b)赋值:set b = 8;
c)作用范围:在begin到end语句块之间。
//mysql存储过程 = java封装方法
定义:是一组为了完成特定功能的Sql语句,经过编译之后存在数据库中,用户通过指定存储过程的名称并给定参数(若有参数)来调用执行它
//创建一个存储过程
create procedure 存储过程名称([参数1],[参数2],...)
begin
要执行的sql语句;
end
//创建一个不带参数的存储过程
//获取所有员工信息
create procedure getStaff()
begin
select * from staff;
end
//调用存储过程
call getStaff();
//存储过程中的参数类型
in:表示输入参数,默认为in,可以不写
out:表示输出参数,mysql没有return,所以返回值要定义为out
inout:既可以是输入参数,也可以是输出参数
//创建一个带参数的存储过程
create procedure pro_add(in a int,in b int)
begin
declare sum int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set sum = a+b;
select sum;
end
//调用带参数的存储过程
call pro_add(2,3);
查询任意图书类型的图书信息
注意:varchar,char类型需要定义长度
select * from books where type_id = (select type_id from book_type where type_name = '黑客');
方法一
create procedure getBooksByName(in tname varchar(50))
begin
select * from books where type_id = (select type_id from book_type where type_name = tname);
end
方法二
create procedure getBooksByName2(in tname varchar(50))
begin
declare tid int;
set tid = (select type_id from book_type where type_name = tname);
select * from books where type_id = tid;
end
在评论表insert一条评论之后,实现article表中的评论数量+1
create procedure getComs(a int,b text,c datetime)
begin
declare pid int;//评论表id
declare wid int;//文章表id
//向评论表存入一条数据
insert into comment(aid,com_content,com_time)
values(a,b,c);
//获取刚存入的评论id
set pid =(select last_insert_id());
//根据评论id获取到文章id
set wid = (select aid from comment where cid = pid);
//根据上一步获取到的文章id,更新文章表的评论数量
update article set coms = coms + 1 where aid = wid;
end
call getComs(10,'太棒了','2017-1-1')
//用存储过程向一个表中存入100条数据
create procedure pro_add100()
begin
declare i int;
declare max int;
set i = 0;
set max = 100;
while i <= 100 do
insert into course(co_name) values('course');
set i = i+1;
end while;
end
总结
(1)存储过程包含单条或者多条sql,都需要写在begin end之间
(2)在存储过程中的每条sql语句结束时都要加';';
(3)存储过程中的参数没有默认值,在调用时,不能省略这个参数,可以用null代替
1、概念类似于函数,就是把一段代码封装起来,
当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else, case,while等控制结构.可以进行sql编程.
2、查看现有的存储过程:
Show procedure status
删除存储过程
3、Drop procedure 存储过程的名字
4、调用存储过程
Call 存储过程名字();
jdbc中调用
CallableStatement cs=con.prepareCall("{call p5(?,?)}");//jdbc调用存储过程
基本查询
1创建存储过程
mysql> delimiter$
mysql> create procedure p1()
-> begin
-> select * from find;
-> end$
3执行存储过程
mysql> call p1();
有参数查询
1创建存储过程
delimiter $
create procedure p2(n int)
begin
select * from orders where id>n;
end$
3执行存储过程
mysql> call p2(8);
有if控制结构
1创建存储过程
delimiter $
create procedure p3(n int,j varchar(10))
begin
if j="电脑" then select * from orders where id>n and gid in(select id from goods where tradename=j);
else select * from orders where id<n and gid in(select id from goods where tradename=j);
end if;
end$
3执行存储过程
mysql> call p3(8,"电脑");
有while控制结构
1创建存储过程
delimiter$
create procedure p4(n int,name varchar(10))
begin
declare i int;
set i=1;
while i<=n do
insert into user values(null,concat(name,i));
set i=i+1;
end while;
end$
3执行存储过程
mysql> call p4(8,"电脑");
jdbc调用存储过程
//调用存储过程只需18毫秒,不用十万条记录机器内存不够
public void add2(int n,String name) throws SQLException{//查询用存储过程
mysqlConnection();
long a=System.currentTimeMillis();//开始时间
cs=con.prepareCall("{call p5(?,?)}");//jdbc调用存储过程
cs.setInt(1,n);
cs.setString(2,name);
cs.executeUpdate();
long b=System.currentTimeMillis();//结束时间
System.out.println("插入用存储过程用时:"+(b-a));
}
public void add1(int n,String name) throws SQLException{//插入不用存储过程
mysqlConnection();
int i=0;
long a=System.currentTimeMillis();//开始时间
while(i<=n){
String sql="insert into user values(null,?)";
pre=con.prepareStatement(sql);
pre.setString(1,name+i);
pre.executeUpdate();
i++;
}
long b=System.currentTimeMillis();//结束时间
System.out.println("插入不用存储过程用时:"+(b-a));
}