存储过程 VS 存储函数(函数)
| | 关键字 |调用语法 | 返回值 | 应用场景 |
|-存储过程-|-procedure-|-call 存储过程()-|-理解为0个或多个-|-一般用于更新-|
| 存储函数 | function | select 函数() | 只能是一个 | 一般用于查询结构为一个值并返回时|
存储函数可以放在select语句中,存储过程不行,反之,存储过程的功能更加强大,包括能够执行对表的操作(创建表、删除表等)和事务操作,这些功能是存储函数不具备的。
存储过程和存储函数的 查看、修改、删除
查看
- show create 语句查看存储过程和函数 创建信息
show create { procedure | function } 存储过程名或函数名
2. show status 语句查看存储过程和函数 状态信息
show { procedure | function } status [ like 'xxx' ]
--[ like 'xxx' ] 匹配存储过程或函数的名称,可以省略。当省略不写时,会列出**MySQL数据库**中存在的所有存储过程和函数 状态信息
3.从information_schema.routines 表中查看存储过程和函数的信息
MySQL 中存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程和函数的信息。
select * from information_schema.Routines
where ROUTINE_NAME='存储过程 | 函数名' [and ROUTINE_TYPE={'PROCEDURE | FUNCTION '}]\G
注意如果在mysql数据库中存在存储过程和函数名称相同的情况,最好指定 ROUTINE_TYPE查询条件是存储过程还是函数。
修改
修改存储过程、函数,不影响存储过程、函数功能,只能修改相关特性,使用alter语句实现
alter {procedure | function} 存储过程或函数名称
[characteristic]
删除
drop { procedure | function } [IF exists] 存储过程或函数的名
IF exists : 如果函数或存储过程,不存在,删除就报错, 加 IF exists 就可以防止发生错误,只是产生warning ,同时可以用 show warnings 查看警告信息。
关于存储过程使用的争议
优点
- 存储过程可以一次编译多次使用。 存储过程只在创建时进行编译,之后的使用都不需要重新编译,所以提高了 SQL 的执行效率
- 可以减少开发工作量。 将代码封装成模块,实际是是编程的核心思想之一,这样可以把复杂的问题拆解成不同的模块,然后模块之间可以重复使用,在减少开发工作量的同时,还能保证代码的结构清晰
- 存储过程的安全性强。我们设定存储过程可以在设置对用户的使用权限,这样就和视图一样具有较强的安全性
- 可以减少网络传输量。 因为代码封装到存储过程中,每次使用只需要调用存储过程即可,这样就减少网络传输量。
- 良好的封装性。在进行相对复杂的数据库操作时,原本需要使用一条一条的SQL语句。可能需要连接多次数据库才能完成的操作。现在变成一次存储过程,只需要连接一次即可
缺点
- 可移植性差。 存储过程不能跨数据库移植,比如 在 MySQL、Oracle、SQL Server里编写的存储过程,在换成其他数据库时需要重新编写
- 调试困难。 只有少数DBMS支持存储过程的调试,对于复杂的存储过程来说,开发和维护都不容易。虽然也有些第三方工具可以对存储过程进行调试,但要收费
- 存储过程的版本管理困难。 比如数据表索引发生变化了,可能会导致存储过程失效。我们在开发软件的时候往往需要进行版本管理,但是存储过程本身没有版本控制,版本迭代更新的时候很麻烦
- 它不适合高并发的场景。 高并发的场景需要减少数据库的压力,有时数据库会采用分表分库的方式,而且对可扩展性要求很高,在这种情况下,存储过程会变得难以维护,增加数据库的压力。