1. 读写权限不同
存储函数:设计之初的目的是只读的(但是实际并没有严格限制)
存储过程:可读可写
存储函数的读写权限这里要特殊说明一下:
创建存储函数的时候后,必须声明函数读写权限,且只能在DETERMINISTIC, NO SQL, or READS SQL DATA中选择。这三者的含义为确定性、无SQL语句、只对数据库进行读操作。
如果没有声明读写权限,就会报下面的错误:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
如果想不报错,除了声明参数还有一个办法,执行SET GLOBAL log_bin_trust_routine_creators = 1;
命令来禁止掉对SUPER权限的要求。
注意:虽然存储函数的声明要求是只读的,但是却不会对函数中的语句进行检查,所有我们仍然可以在存储函数中进行写数据库的操作。
2. 返回不同
存储函数:必须有返回值
存储过程:返回值可有可无,通过OUT参数返回
3. 调用方式不同
存储函数:只能在sql语句中调用,比如:select function();
存储过程:只能单独调用,比如:call procedure();
总结
综上所述,可以看出存储函数与存储过程在设计上还是用不一样的地方
- 存储函数:是为了计算一些东西
- 存储过程:是一些sql语句的集合