存储过程
含义:对预先编译的sql语句的封装
过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器发出调用存储过程的指令,服务器就可以把预先存储好的这一系列sql语句全部执行。
好处:简化操作,提高sql语句的复用性,减少开发程序员的压力,提高效率。
减少网络传输量(客户端不需要把所有的sql语句传给MySQL服务器)
减少sql语句在网络暴露的风险
坏处:1、可移植性差。存储过程不能跨数据库移植,比如在MySQL、Oracle和sQL Server里编写的存储过程,在换成其他数据库时都需要重新编写。
2、调试困难。只有少数DBMS支持存储过程的调试。对于复杂的存储过程来说,开发和维护都不容易。虽然也有一些第三方工具可以对存储过程进行调试,但要收费。
3、存储过程的版本管理很困难。比如数据表索引发生变化了,可能会导致存储过程失效。我们在开发软件的时候往往需要进行版本管理,但是存储过程本身没有版本控制,版本迭代更新的时候很麻烦。
4、它不适合高并发的场景。高并发的场景需要减少数据库的压力,有时数据库会采用分库分表的方式,而且对可扩展性要求很高,在这种情况下,存储过程会变得难以维护,增加数据库的压力,显然就不适用了。
小结:
创建存储过程:
基本语法:
delimiter $ #设置新的结束标记
create procedure 储存过程名【in 参数名 参数类型|out 参数名 参数类型|inout 参数名 参数类型】
(charactercis 存储过程的约束)可省略
begin
过程体
赋值语句:select 字段 into 参数名;
end $
delimite;
代码举例:
调用存储过程
call 存储过程名(参数);
存储函数:
基本语法:
create function 函数名(参数名 参数类型....)
returns 返回值类型
【characterics 约束条件】
使用 SET GLOBAL log_bin_trust_function_creators = 1;就不需要添加上面的约束条件
begin
函数体 #一定会有return (select 语句)语句
end
调用函数
select 函数名(参数);
存储过程与存储函数的对比
存储过程与存储函数的查看、修改、删除
查看:show create 【procedure|function】 名字[\g];
修改:alter 【procedure|function】 名字【 characterics...】
删除:drop 【procedure|function】名字;