本文摘自PHP中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于mysql存储过程的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1、什么是存储过程
为以后的使用而保存的一条或多条MySQL语句的集合。
存储过程思想上就是数据库 SQL 语言层面的代码封装与重用。
(相关推荐:MySQL教程)
2、为什么要使用存储过程
把处理封装在容易使用的单元中,简化复杂的操作
防止错误保证了数据的一致性
简化对变动的管理。(修改对应表名、列名等修改对应存储过程的代码,对于使用的人不需要知道变化)
提高性能
灵活
总的来说是简单、安全、高性能
缺点:
编写比SQL语句复杂
权限问题(可能无权、一般都是使用存储过程、没有创建存储过程的权限)
3、创建存储过程
1 2 3 4 5 | CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END
|
注意:在命令行中输入的问题
1 2 3 4 5 6 | mysql> delimiter
mysql> CREATE PROCEDURE productpricing()
-> BEGIN
-> SELECT Avg(prod_price) AS priceaverage
-> FROM products;
-> END
|
4、使用存储过程
存储过程实际上是一种函数
4、删除存储过程
1 2 | drop procedure productpricing;
drop procedure if EXISTS productpricing;
|
5、使用参数
一般,存储过程并不显示结果,而是把结果返回给你指定的变量
变量(variable)内存中一个特定的位置,用来临时存储数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE PROCEDURE productpricing(
OUT p1 DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT MIN(prod_price)
INTO p1
FROM products;
SELECT MAX(prod_price)
INTO ph
FROM products;
SELECT avg(prod_price)
INTO pa
FROM products;
END ;
|
关键字OUT指出相应的参数用来从存储过程传出 一个值(返回给调用者)。
MySQL支持IN(传递给存储过程)、
OUT(从存 储过程传出,如这里所用)
INOUT(对存储过程传入和传出)类型的参 数。
变量名 所有MySQL变量都必须以@开始。
调用存储过程
1 | call productpricing(@pricelow,@pricehign,@priceaverage);
|
查询
1 | SELECT @priceaverage,@pricehign,@pricelow;
|
使用in和out
创建
1 2 3 4 5 6 7 8 9 10 | CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END ;
|
调用
1 | call ordertotal(20005,@total);
|
查询
6、建立智能存储过程
迄今为止使用的所有存储过程基本上都是封装 MySQL简单的SELECT语句。虽然它们全都是有效的存储过程例子,但它们所能完成的工作你直接用这些被封装的语句就能完成(如果说它们还能带来更多的东西。那就是使事情更复杂)。只有在存储过程内包含业务规则和智能处理时,它们的威力才真正显现出来。
1 2 3 4 | 考虑这个场景。你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(或许是你所在州中那些顾客)。那么,你需要做下面几件事情:
1、获得合计(和以前一样)
2、把营业税有条件的添加到合计
3、返回合计(带或不带税的)
|
我们输入如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | -- Name: ordertotal
-- Parameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxtable
-- ototal = order total variable
CREATE PROCEDURE ordertotal (
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding 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(item_price*quantity)
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 out variable
SELECT total INTO ototal;
END ;
|
1 2 3 4 5 6 7 8 9 10 11 12 | 此存储过程有很大的变动。首先,增加了注释(前面放置 --)。在存储过程复杂性增加时,这样做特别重要。
添加了另外一个参数 taxable,它是一个布尔值(如果要增加税则为真,否则为假)。
在存储过程体中,用 DECLARE语句定义了两个局部变量。 DECLARE要求指定变量名和数据类型,
它也支持可选的默认值(这个例子中的 taxrate的默认被设置为 6%)。SELECT 语句变,因此其结果存储到 total(局部变量)而不是 ototal。
IF 语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量 total。
最后,用另一SELECT语句将total(它增加或许不增加营业税)保存到 ototal。
注意:COMMENT关键字 ,本例子中的存储过程在 CREATE PROCEDURE语句中包含了一个 COMMENT值。
它不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示。
这显然是一个更高级,功能更强的存储过程。为试验它,请用以下两条语句:
第一条:
|
1 2 | call ordertotal(20005, 0, @total);
SELECT @total;
|
1 2 3 4 5 | +--------+
| @total |
+--------+
| 38.47 |
+--------+
|
1 2 | call ordertotal(20009, 1,@total);
SELECT @total;
|
1 2 3 4 5 | +--------+
| @total |
+--------+
| 36.21 |
+--------+
|
1 | BOOLEAN值指定为1 表示真,指定为 0表示假(实际上,非零值都考虑为真,只有 0被视为假)。通过给中间的参数指定 0或1 ,可以有条件地将营业税加到订单合计上。
|
这个例子给出了 MySQL的IF 语句的基本用法。 IF语句还支持 ELSEIF和ELSE 子句(前者还使用 THEN子句,后者不使用)。在以后章节中我们将会看到 IF的其他用法(以及其他流控制语句)。
7、检查存储过程
为显示用来创建一个存储过程的CREATE语句
1 | show create PROCEDURE ordertotal;
|
为了获得包括何时、由谁创建等详细信息的存储过程列表
表比较多,用like过滤
1 | show procedure status like 'ordertotal' ;
|
以上就是mysql存储过程的详细介绍(代码示例)的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
mysql高级操作指令汇总
mysql innodb 事务锁源码分析
centos7安装和配置mysql
mysql中select语句介绍及使用示例
mysql数据库如何升级脚本制作过程分享
mysql的初始密码在哪看
mysql收费吗
mysql备注(注释)代码怎么打?
mysql清空表数据命令是什么?
mysql存储引擎基础知识
更多相关阅读请进入《mysql》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » mysql存储过程的详细介绍(代码示例)