存储过程

2017-03-19  本文已影响0人  蘋果_283e

获取刚存入的评论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));

}

上一篇下一篇

猜你喜欢

热点阅读