MySQL基础教程之存储过程

数据库 MySQL
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。

存储过程

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。

在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据, 删除等等。

为什么要使用存储过程

  1. 通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面例子所述)。
  2. 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试验和测试)存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
  3. 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。

一个简单的存储过程

  1. create procedure porcedureName () 
  2. begin 
  3.     select name from user
  4. end 

存储过程用create procedure 创建, 业务逻辑和sql写在begin和end之间。mysql中可用call porcedureName ();来调用过程。

  1. -- 调用过程 
  2. call porcedureName ();  

该存储过程没有参数, 只是在调用的时候查询了用户表的用户名而已, 调用结果如下

name
admin
admin1
admin2
admin3

删除存储过程

  1. DROP PROCEDURE IF EXISTS porcedureName; -- 没有括号() 

使用参数的存储过程

  1. create procedure procedureName( 
  2.     out min decimal(8,2), 
  3.     out avg decimal(8,2), 
  4.     out max decimal(8,2) 
  5. BEGIN 
  6.     select MIN(price) INTO min from order
  7.     select AVG(price) into avg from order
  8.     select MAX(price) into max from order
  9. END 

此过程接受三个参数, 分别用于获取订单表的最小、平均、最大价格。每个参数必须具有指定的类

型,这里使用十进制值(decimal(8,2)), 关键字OUT指出相应的参数用来从存储过程传出

一个值(返回给调用者)

MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。存储过程的代码位于BEGIN和END语句内,如前所见,它们是一系列SELECT语句,用来检索值,然后保存到相应的变量(通过指定INTO关键字)

为调用此修改过的存储过程,必须指定3个变量名,如下所示:(所有MySQL变量都必须以@开始。)

  1. -- 由于过程指定三个参数, 故调用必须要参数匹配 
  2. call procedureName(@min, @avg, @max);  

该调用并没有任何输出, 只是把调用的结果赋给了调用时传入的变量(@min, @avg, @max)。然后即可调用显示该变量的值。

  1. select @min, @avg, @max

结果如下

@min @avg @max
42.00 601.00 2222.00

使用in参数, 输入一个用户id, 返回该用户所有订单的总价格。

  1. create procedure getTotalById ( 
  2.     in userId int
  3.     out total decimal(8,2) 
  4. BEGIN 
  5.     select SUM(r.price) from order r 
  6.     where r.u_id = userId 
  7.     into total; 
  8. END 

调用存储过程

  1. call getTotalById(1, @total); 
  2. select @total;  

结果将返回该用户所有订单的合计价格。

复杂一点的过程, 根据用户id获取该用户的所有订单价格, 并动态的选择是否加税。代码设计如下

  1. create procedure getTotalByUser2( 
  2.     in userId int
  3.     in falg boolean, -- 是否加税标记 
  4.     out total decimal(8,2) 
  5. begin 
  6.     DECLARE tmptotal DECIMAL(8,2); 
  7.     DECLARE taxrate int DEFAULT 6;-- 默认的加税的利率 
  8.      
  9.     select SUM(r.price) from order r 
  10.     where r.u_id = userId 
  11.     into tmptotal; 
  12.      
  13.     if taxable then 
  14.         select tmptotal + (tmptotal/1000*taxrate) into tmptotal; 
  15.     end if; 
  16.      
  17.     select tmptotal into total; 
  18. END 

该过程传入三个参数, 用户id, 是否加税以及返回的总价格,在过程内部, 定义两个局部变量tmptotal和taxrate,把查询出来的结果赋给临时变量, 在判断是否加税。最后把局部变量的值赋给输出参数。 

  1. call getTotalByUser2(1, false, @total); -- 不加税 
  2. call getTotalByUser2(1, true, @total);  -- 加税 
  3. select @total; 

 

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2017-07-18 10:14:23

OracleMerge into教程

2010-05-12 17:55:30

MySQL 5.0

2009-07-24 09:20:15

数组实例

2010-06-13 11:21:32

MySQL 5.0

2009-06-22 09:23:18

事件监听器

2011-04-15 09:20:56

ASP.NET MVC

2009-07-24 10:09:08

ASP.NET个性化ASP.NET基础教程

2010-06-11 13:53:54

UML建模

2009-10-21 17:36:36

VB基础教程

2021-07-16 07:21:45

C++可调用对象std::functi

2017-12-12 07:47:59

dockermarathon服务器

2021-02-06 07:49:48

C语言编程开发技术

2011-07-07 13:58:13

Windows 200活动目录

2009-10-26 09:04:35

VB.NET数据库基础

2011-07-18 09:35:29

iPhone 框架

2009-07-22 13:32:43

iBATIS DAO

2010-06-28 09:21:04

SQL Server存

2011-09-13 16:39:50

Android UI设

2011-07-21 10:17:53

java

2022-09-29 07:27:50

DaprKubernetes
点赞
收藏

51CTO技术栈公众号