![5b68287713d17d877ac3fea2b08b48dd.png](https://i-blog.csdnimg.cn/blog_migrate/25ad49293ed61b1594fe0540fac70174.jpeg)
平时和数据打交道比较多的测试同学,可能会经常接触到数据库,增删改查是最基本的sql语句运用,但是遇到一些特殊场景的时候,需要同时对大批量数据进行操作,常备的基本句式可能就应付不过来了,例如你要准备5万条测试数据,难道要用insert into一行行新增吗;或者让你批量修改某张大表中的某一列数据呢?
这种时候我们往往需要借助存储过程。
存储过程,就是在数据库中编写的sql语句集合,只要编写一次就可以反复使用,学习过Python或者其它语言的同学,把它当成函数或者方法,可能会更加容易理解一点。
----------------------------------------
首先,我们来学习一下,存储过程的基本结构:
存储过程叫做procedure,我们使用create语句来创建,begin和end中间的部分,就是存储过程需要执行的语句。
![8e51d8afc7e32444568d980b90b9b0bd.png](https://i-blog.csdnimg.cn/blog_migrate/531c3d21d642cf3fbe6c6bd6b7ce92f7.jpeg)
test是这个存储过程的名字,括号里面可以写传入或者传出的参数,我们来写个简单的例子。
![4dd5a84d1f2097fb3c6130c46c6311b5.png](https://i-blog.csdnimg.cn/blog_migrate/ef18495f9504831a3215d7da6a05ebdd.jpeg)
这个例子里面,添加了两行新内容,in a int,in b int ,表示可以接收用户传入的两个整型值,select a+b 表示将用户传入的两个值相加后输出打印。
调用刚刚写好的存储过程,我们使用call。
call后面加上存储过程的名字,括号中加上传入的参数值,数量和顺序要与定义的参数类型和数量一致。
![22e491c174bc086ac55e953849a2c83b.png](https://i-blog.csdnimg.cn/blog_migrate/604da7efed6f304cb9c3af94b0c14288.jpeg)
----------------------------------------
除了可以在括号中定义参数,也可以在存储过程内部定义。
![6d2121261cc38de0b5cad4348f893e97.png](https://i-blog.csdnimg.cn/blog_migrate/f75c93eacfa9286c428fff1650ccde97.jpeg)
declare是声明变量的名字和类型,set给这个变量赋值,select将其值输出打印。
![c136fa7106c74df805be4cfdddf4d987.png](https://i-blog.csdnimg.cn/blog_migrate/a24806e4844e0d293d1f36c017ac6783.jpeg)
----------------------------------------
接下来可以讲讲最基本的两个控制语句了。
----------------------------------------
if 判断语句在存储过程中的基本结构是:
![1599fd459c0e963a55460655c0ad59f0.png](https://i-blog.csdnimg.cn/blog_migrate/4b76c2bf62caf4e84ec9ad3d01b93768.jpeg)
写一个简单的脚本:
![5cd11800ec1d8cf51b70a8349291a7f1.png](https://i-blog.csdnimg.cn/blog_migrate/c309df525cdc23e4c0d273f75feef51b.jpeg)
脚本的意思是,让用户输入一个数,我在过程内定义一个数,然后比较两个数字的大小。
![71b7f94fccf44aa15c0cb8fd20f8f58d.png](https://i-blog.csdnimg.cn/blog_migrate/dbc22001cab8bf17a03e5c935dd21b98.jpeg)
----------------------------------------
循环语句可选择的比较多,这里我们主要用while来尝试一下。
while的基本语法结构是:
![5e43607c2b5ca257e1372cc0d595c758.png](https://i-blog.csdnimg.cn/blog_migrate/7429c2c390e87605a624597bb473fbd2.jpeg)
我们来写个简单的例子
![997e4d5b05cd0e0906235a17fd7fb6fd.png](https://i-blog.csdnimg.cn/blog_migrate/f86a0a411eb1797850a7a38a944bbc44.jpeg)
循环的打印1到10的数(一定要注意循环中是否有自增或者自减的存在):
![ad14147e530eb3a0e9bb5e05364194eb.png](https://i-blog.csdnimg.cn/blog_migrate/78fb86d89b13805468ae86429dc7bf01.jpeg)
----------------------------------------
现在我们来看看如何使用随机函数来制造随机的数字、随机的字符串和随机的日期。
随机函数在mysql中是rand(),这个函数随机的范围是0--1之间的小数。
★如果想要随机某个范围的整数,有个基本的数学公式:
floor(开始值+rand()*(结束值-开始值+1));
例如要随机50-100之间的整数,可以使用floor(50+rand()*(100-50+1));
★随机字符串需要将rand()随机,substr()字符串截取,concat()字符串拼接这几个函数结合起来运行
举个例子,加入现在想要随机一个姓名,可以简单的这么设计,随机一个姓,再随机一个名,然后拼起来。
现在实现姓的随机:
![d25ed6cb56952bc20b671b1ae998f214.png](https://i-blog.csdnimg.cn/blog_migrate/5312096ee77fb7136bf314fea660b39f.jpeg)
在百家姓中随机一个位置,然后截取一个长度的字符,这不就是随机一个姓氏吗。
相同的操作再来一遍:
![ac06c81481d7af1ec4c8c77c587f60c8.png](https://i-blog.csdnimg.cn/blog_migrate/718cf522a42bbcdd34ee9c9617c1a201.jpeg)
现在我们有了随机的名。
最后拼接一下:
![7667006d18c22ec9c1fd2d0117e96324.png](https://i-blog.csdnimg.cn/blog_migrate/8127b4b0ff9984a6e4931c703f04a301.jpeg)
随机的名字出现了!
★随机的日期我们也可以实现一下:
![2697da297de1877a862764f62fdb5cf5.png](https://i-blog.csdnimg.cn/blog_migrate/7b7ce08bf42552074ea24df3d1079faa.jpeg)
看到这里的同学们,肯定觉得脚本已经渐渐疯狂......
还没有停止,我们把这些随机统统塞到一起去,实现往表中指定插入数据的效果。
现在有张空表,往里面插入100行测试数据:
![fcc010a34167b37b81583b892252b20c.png](https://i-blog.csdnimg.cn/blog_migrate/0f794e591020fabf305bfebc06a0ca3a.jpeg)
![96f90e68bd12cd65b659f0ae624484e9.png](https://i-blog.csdnimg.cn/blog_migrate/dbcb32c48aceba4a2eb5fb7db7e0e1f9.jpeg)
![d1de209470a2c76649032b45d720f8a3.png](https://i-blog.csdnimg.cn/blog_migrate/dec6fab6eb9dcd30c574401f4a3c122f.jpeg)
看下效果:
![eaa35cd740bbdaf47b2a361c3dd588c7.png](https://i-blog.csdnimg.cn/blog_migrate/e2b4e92a5be6d8efaaca9dabe013a652.jpeg)
搞定!!!
学会了吗?