大多数SQL语句都是针对一个或多个表的单条语句。但并非所有业务都这么简单,经常会有复杂的操作需要多条语句才能完成。
比如用户购买一个商品,要删减库存表,要生成订单数据,要保存支付信息等等,他是一个批量的语句执行行为。
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。
优点:
提高代码的复用性:把一些通用操作内容封装到一个存储过程中,可以不断的给业务功能复用。
简化操作:避免在业务中写大量的代码
提高效率:减少执行次数和数据库服务器连接次数。
提高安全性:通过存储过可以减少对基础数据的误操作,参数化的存储过程一定程度上可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
说存储过程之前,先来了解两个重要的知识点:自定义变量 和 delimiter关键字。
变量由用户自定义的,而非系统已经存在的。
第一步声明;第二步赋值;第三步使用(调用、比较和运算)
包含用户变量和局部变量,我们一个个来看:
针对当前会话有效,作用域同会话变量。
用户变量可以在任何地方使用,既可以是包含的begin和end,也可以是在这之外。
这边需要注意:使用了@符号来定义 变量,set中=号前面冒号是可选的,select方式=前面必须有冒号。
一种方式就是跟声明并初始化一致,直接set、select进行赋值,
另外一种就是直接从其他表、视图或变量中查询并赋值,如下:
这边需要注意两种select的使用方式
declare用于定义局部变量,在存储过程和函数中通过declare定义变量在begin…end中,且在语句之前。并且可以通过重复定义多个变量
declare变量的作用范围同编程里面类似,在这里一般是在对应的begin和end之间。在end之后这个变量就没有作用了,不能使用了。这个同编程一样。
declare 变量名 变量类型,后面的 [ 默认值] 为可选;
注意自定义变量和局部变量的区别,一个前面有@符号,一个没有。
查看变量的值
变量类型
作用域
定义位置
语法格式
用户变量
当前会话都有效
会话的任一地方
加<code>@</code>符号,无需指定类型
局部变量
所属定义的begin end之间
begin...end中的第一个位置,紧跟在begin后面
不加<code>@</code>符号,需指定类型
delimiter是mysql分隔符,在mysql客户端中分隔符默认是分号;。如果一次输入的语句较多,并且语句中间有分号,这时需要新指定一个特殊的分隔符。
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。
详细解释:
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束, 那么回车后,mysql将会执行该命令。如输入下面的语句 :
然后回车,那么MySQL将立即执行该语句。
但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。 这种情况下,就需要事先把delimiter换成其它符号,如//、$$或者;;。
更改结束标志的定义如下:
举个例子:创建一个存储过程,在创建该存储过程之前,将delimiter分隔符转换成符号“//”,最后在转换回符号“;”。
上面就是,先将分隔符设置为 //, 直到遇到下一个 //,才整体执行语句。
执行完后,最后一行, delimiter ; 将mysql的分隔符重新设置为分号;
如果不修改的话,本次会话中的所有分隔符都以// 为准。
存储过程的操作包含创建
参数模式有3种:
in:该参数可以作为输入,也就是该参数需要调用方传入值。
out:该参数可以作为输出,也就是说该参数可以作为返回值。
inout:该参数既可以作为输入也可以作为输出,也就是说该参数需要在调用的时候传入值,又可以作为返回值。
参数模式默认为IN,一个存储过程可以有多个输入、多个输出、多个输入输出参数。
所以创建存储过程的时候参数可能存在一下几种情况:
编写存储过程
调用实现:对比数据可确定调用成功
编写存储过程:
调用实现:
调用实现
自己试试吧,小伙子们
注意:调用存储过程关键字是<code>call</code>。
如上所示 ,所有的call都是这样的额
存储过程只能一个个删除,不能批量删除。
if exists:表示存储过程存在的情况下删除,我们上面演示的存储过程都是判断如果存在就先删除。
存储过程不能修改,若涉及到修改的,可以先删除,然后重建。
可以查看存储过程详细创建语句。
存储过程的优点开篇已经说过了,这边就不赘述了,个人使用的最大感触是,尽量不要在应用代码中写大量的脚本逻辑,做成存储过程或者函数会更高效简洁且易于维护。

架构与思维·公众号:撰稿者为bat、字节的几位高阶研发/架构。不做广告、不卖课、不要打赏,只分享优质技术
码字不易,欢迎关注,欢迎转载
作者:翁智华
出处:https://www.cnblogs.com/wzh2010/
本文采用「CC BY 4.0」知识共享协议进行许可,转载请注明作者及出处。