存储过程

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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容