《mysql必知必会》读书实战笔记23-存储过程

第23章 使用存储过程

23.1 存储过程

存储过程,是为了完成一个复杂任务,而编写的多条sql语句的集合,语句执行次序不定,需要根据检索条件判断。

存储过程实际上是一种函数,因此存储过程名后要加括号(),来放置参数,即使没有参数也要括号。

23.2 为何使用存储过程

3个优点:
简单:将复杂语句封装,简单调用即可;业务逻辑更改,直接修改存储过程。
安全:不需反复编写复杂代码,防止错误发生;执行权限和访问权限分开,保障代码安全。
高性能:比单独执行sql语句快,编码灵活。

23.3 使用存储过程

23.3.1创建存储过程

例:返回产品的平均价格:
delimiter //
create procedure product_avgprice()  #括号来放置参数,即使没有参数也要括号。
begin
select avg(prod_price) as avg_price  from products;
end//
delimiter ;

自定义分隔符:
DELIMITER // 自定义定界符、分隔符,除了\,都可以作为分隔符。
自定义分隔符作用:替换系统分隔符-分号(;),防止系统报错。因为系统分不清(;)是存储过程结尾,还是sql语句结尾。

23.3.2 执行存储过程

例:查询产品平均价:call product_avgprice();  #括号来放置参数,即使没有参数也要括号。

23.3.3 删除存储过程

例:删除prodcut_avgprice2存储过程:
drop procedure if exists product_avgprice2;  #注意这里过程名称后不带括号。

关键字IF EXISTS:表示如果存储过程存在就删除,不存在也不会报错,如果不加次关键字,存储过程不存在,mysql服务器会报错。

23.3.4 使用参数

变量:内存中一个特定位置,用于临时存放数据。

参数类型
IN:传入存储过程
OUT:传出存储过程
INOUT:既传入又传出存储过程

参数的数据类型:和表的数据类型一样,但一个参数只能对应一个值,不能是多行的记录集。

:创建存储过程,得到产品表中产品的最高检、最低价、平均价:

delimiter // #定义分隔符为//,注意空格
create procedure prod_price(
out pl decimal(8,2), #括号内为存储过程要传出的参数
out ph decimal(8,2),
out pa decimal(8,2)
)
begin #过程体开始
select min(prod_price),max(prod_price),avg(prod_price) into pl,ph,pa from products;
end
//        #过程体结束
delimiter ;  #定义分隔符改回分号;,注意空格。

执行存储过程prod_price:call prod_price(@lowprice,@highprice,@averageprice);

显示平均价、最高价、最低价:select @averageprice,@highprice,@lowprice;

:根据订单号显示订单总价:
delimiter //
create procedure totalprice(
in order_number int,
out order_total decimal(8,2)
)
begin
select sum(quantity*item_price) into order from orderitems where order_num=order_number;
end 
//
delimiter ;

显示订单20005的总价:
(1)执行存储过程,订单号20005:call totalprice(20005,@order_total);
(2)查询总价:select @order_total;

23.3.5 智能存储过程

例:根据订单号显示订单总价,根据客户不同,总价可能要包含营业税:

delimiter //
-- name:odertotal 存储过程名:订单总价
-- parameters: onumber= order number 订单编号
--                    taxable= 0 if not taxable, 1 if taxable 是否含税
--                    ototal= order total variable 订单总价变量

create procedure ordertotal(
in onumber int,
in taxable boolean,
out ototal decimal(8,2)
)  comment 'obtain order total,optionally add tax'
begin
-- declare variable for total
declare total decimal(8,2);
-- declare tax percentage
declare taxrate int default 6;
-- get the order total
select sum(quantity*item_price)
from orderitems
where order_num=onumber
into total;

-- is this taxable?
if taxable then
-- yes,so add taxrate to the total
select total+(total/100*taxrate ) into total;
end if;
-- and finally,save to our variable
select total into ototal;
end//
delimiter ;

例:执行存储过程,并查询订单20005的不含税总价合计:
call ordertotal(20005,0,@total);
select @total;

例:执行存储过程,并查询订单20005的不含税总价合计:
call ordertotal(20005,1,@t);
select @t;

“注释”有三种方法:

1、comment '注释内容'

2、符号 “-- ” ,注意:做注释时,--后面要有空格,且必须放在行首,不可以和sql语句放在同一行。

3、符号“#” ,可以和sql语句放在同一行。
注释的内容会在查询存储过程状态时显示:show procedure status like ‘过滤模式’ \G;

23.3.6 检查存储过程

例:查询存储过程的创建语句:show create procedure ordertotal \G;

例:查询存储过程的状态:show procedure status like '过程名' \G;
# \G表示垂直显示文字。
# like后也可用通配符过滤模式,和select语句中一样。


《mysql必知必会》是一本好书,是一本sql语言入门书,豆瓣评分很高。

作者是英国的Ben Forta,世界知名的技术作家,由人民邮电出版社发行,我觉得原作名: MySQL Crash Course,直译为:《MYSQL速成》更具畅销书潜质,只是比较俗吧,呵呵。

书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。

前三章是基础概念,讲了SQL和数据库的基本概念,Mysql数据库的概念和使用方法,第四章开始SQL实操练习,这里是本书的一些实操练习笔记,有兴趣的话可以按这个练习几遍,相信对新手会很有帮助,让你不经意间功力大增。

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

推荐阅读更多精彩内容