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

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语句的集合
posted @ 2022-05-22 15:55  HZX↑  阅读(215)  评论(0编辑  收藏  举报