存储函数与存储过程的区别

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语句的集合
    原文作者:frcoder
    原文地址: https://blog.csdn.net/u012107143/article/details/101057617
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞