![494f7edf215da3afe929b6c8ed2c8a7d.png](https://i-blog.csdnimg.cn/blog_migrate/a28dbcd467a8fb306e1a00af0c21cee4.jpeg)
面试中有时候会问:存储过程有什么用?看了今天的知识,你就知道如何回答了。1.存储过程是什么?
假如你每天要开车完成一些列重复的操作:车钥匙启动车,倒车。现在出现了一款新车,可以自动的完成这些重复的工作。每次你上车以后,车就自动帮助你倒出来了。
![b8a8a84a3c29452d30e8bc6247883673.gif](https://i-blog.csdnimg.cn/blog_migrate/f9d8ce4c276ad19eb2f44514036d16bf.gif)
同样的,在工作里也会经常遇到重复性的工作,这时候就可以把常用的SQL写好存储起来,这就是存储过程。
这样下次遇到同样的问题,直接使用存储过程就可以了,就不需要再重新写一遍SQL了,这就极大的提高了工作效率。2.如何使用存储过程?
使用存储过程需要:1)先定义存储过程 2)使用已经定义好的存储过程。(1)无参数的存储过程
定义存储过程的语法形式:
![cc85ee96c2cae5e3e6f7471019e1baa4.png](https://i-blog.csdnimg.cn/blog_migrate/6a1bd879d9e236efcc8b327d76571c9e.png)
语法里的begin...end用于表示sql语句的开始和结束。语法里面的<sql语句>就是重复使用的sql语句。下面通过一个例子看下如何使用。例如查出“学生表”里的学生姓名。
sql语句是:
![3dde67df216bd4c85c0811ee0a581dbc.png](https://i-blog.csdnimg.cn/blog_migrate/e0262c1bbbc571480001c62d7477cd94.png)
把这个sql语句放入存储过程的语法里,并给这个存储过程起个名字叫做就a_stuent1:
![0b8d5c983619d2a28b8236822ee56a29.png](https://i-blog.csdnimg.cn/blog_migrate/9fcb8706fcfb05a668f90412fa4e627a.png)
在navicat里允许以后,建立的存储过程就会在下图的地方
![f60976ef5ee26f04ae6ae57b713cb75f.png](https://i-blog.csdnimg.cn/blog_migrate/c89772fe500a52cc350ca11a1b63bae4.jpeg)
下次使用存储过程的用下面sql语句就可以,就不需要重新写一遍sql了。
![bc8e0150356c1a24ac6d13f5aa65c23a.png](https://i-blog.csdnimg.cn/blog_migrate/4c88fc54874c2b7377d0882377da74c3.png)
(2)有参数的存储过程
前面的存储过程名称后面是(),括号里面没有参数。当括号里面有参数时,就是下面的语法:
![32f387429fb604a9143543b9388d380d.png](https://i-blog.csdnimg.cn/blog_migrate/1f3097f303a01204091a552774e3909c.png)
通过一个案例看下,现在要在“学生表”里查找出指定学号的学生姓名。如果指定学号是0001,那么sql语句是:
![42b7036d86796b9f0d9670357906a825.png](https://i-blog.csdnimg.cn/blog_migrate/c6cd11d865b7ddc7ca466d4c031e2428.png)
现在问题来了,一开始不知道指定学号是哪一个,只有使用的时候才知道业务需求。比如今天要查找学号0001,明天要查找学号002。这时候就需要用到参数,来灵活应对这种情况。把sql语句放入存储过程语法里就是:
![778fb5e00d3e7a5820be7deece99995d.png](https://i-blog.csdnimg.cn/blog_migrate/e7873587cebedd1fcc6ce71a66b392b6.png)
其中getNum是存储过程的名称,后面括号里面的num varchar(100)是参数,参数由2部分组成:参数名称是num;参数类型是是varchar(100),这里表示是字符串类型。
存储过程里面的sql语句(where 学号=num)使用了这个参数num。这样在使用存储过程的时候,给定参数的值就可以灵活的按业务需求来查询了。
比如现在要查询学号=0001的学生姓名,那么就在使用存储过程的参数中给出学号的值,也就是下面括号里的0001:
![3c372f63fe6ee2c505b312a653eff6e9.png](https://i-blog.csdnimg.cn/blog_migrate/5dbd571c0c80a3c802e254002c536e7e.png)
3)默认参数的存储过程
前面的存储过程名称后面是(参数1,参数2),括号里面只包含参数的类型和名字,方便调用。
存储过程还一种情况是有默认参数,是下面的语法。
in 输入参数:参数初始值在存储过程前被指定为默认值,在存储过程中修改该参数的值不能被返回。
![fb6d437f3c36ac91fad32d87e53864d6.png](https://i-blog.csdnimg.cn/blog_migrate/81308b985f573c0cfc8bb8dc8ee35995.jpeg)
out输出参数:参数初始值为空,该值可在存储过程内部被改变,并可返回
![ffe14d3c56420a7ea978dd372eb55fdd.png](https://i-blog.csdnimg.cn/blog_migrate/2245660968011ed71e774ec2f15adcc5.jpeg)
inout输入输出参数:参数初始值在存储过程前被指定为默认值,并且可在存储过程中被改变和在调用完毕后可被返回
![78355a342df4d4886d143f87cc056f35.png](https://i-blog.csdnimg.cn/blog_migrate/ef09278bb2b2a35d8ceb6fe8f9d49941.jpeg)
3.有哪些注意事项
1)定义存储过程语法里的SQL语句代码块必须是完整的sql语句,必须用“;”结尾
create procedure 存储过程名称(参数1,参数2,...) begin <sql语句> ; end;
2)定义不同的存储过程,要使用不同的存储过程名称,相同的存储过程的名字会引起系统报错。4.存储过程有什么用?
![54a9375cd5d2afbf13f1bb44f7a40abe.png](https://i-blog.csdnimg.cn/blog_migrate/4e239a38a462dc04b44b158ef4afe6e6.jpeg)
如果业务比较复杂、重复性工作比较多,存储过程会比较实用。
把重复要做的事情整理成一步一步的业务步骤,然后把业务步骤写成sql语句,然后再把sql语句写到存储过程的语法里。就像自动驾驶一样,把可能遇到的状况提前规划好,就不需要自己操纵方向盘,车子就按照我们写的步骤向前开了。
推荐:如何从零学会sql?
![3f324480a621a60c2237d78c395834df.png](https://i-blog.csdnimg.cn/blog_migrate/234e0155dd6928f5e52407f94fe190d5.jpeg)