MySQL的存储过程和存储函数(UDF)的区别

 我来答
爱可生云数据库
2020-06-03 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部

背景

在上一篇推文中,我们介绍了 MySQL Group Replication 8.0.16 支持信息碎片化功能来增强大型事务处理能力。

如果您想在组复制中使用该功能,则任何组成员的版本都不能低于 8.0.16!

简单地说就是由于低版本协议上不支持。MySQL 8.0.16 的组通讯开始支持新协议,简称“分段协议”,之前的版本中只有一种“压缩协议”。

如果多个成员想加入复制组,那么在协议匹配上遵循以下原则:

  • 现有复制组成员和新加入成员版本相同,加入成功。

  • 低版本成员想加入高版本的组会被驱逐,加入失败。

  • 高版本的成员想加入低版本的组,单独加入成功,多个加入失败。

  • 例如:

  • 一个 MySQL Server 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。

  • 一个 MySQL Server 5.7.24 实例无法成功加入使用通信协议版本 8.0.16 的组。

  • 两个 MySQL Server 8.0.16 实例无法同时加入使用通信协议版本 5.7.24 的组。

  • 两个 MySQL Server 8.0.16 实例可以同时加入使用通信协议版本 8.0.16 的组。

  • 新增 UDF

    为了能让高版本的复制组更便于加入低版本的成员,MySQL 8.0.16 新增两个 UDF。

    您可以使用两个新的 UDF 命令去管理组通信协议:

    1. group_replication_set_communication_protocol(new_protocol)

    设置组复制通讯协议版本

  • SELECT group_replication_set_communication_protocol("8.0.15");


  • 填入一个所有成员都支持的版本号,即:new_protocol ≤ 所有成员的 MySQL版本。

    new_protocol 格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

    2. group_replication_get_communication_protocol()

    获取复制中最旧成员的 MySQL 版本号

  • SELECT group_replication_get_communication_protocol();    +------------------------------------------------+    | group_replication_get_communication_protocol() |    +------------------------------------------------+    | 5.7.14                                         |    +------------------------------------------------+


  • 获取的版本号可能与设置的值不一致,但不一致的版本之间组复制协议是一样的。

    返回结果格式:major.minor.patch (主版本号.次版本号.发布版本号)例如:8.0.15。

    以上两个 UDF 对全部组成员有效,主机或从机上均可执行。

    结论

    若想使用信息碎片功能。建议将组复制成员全部升级为 8.0.16。

    若组内成员版本仅有部分为 8.0.16,可以用两个新的函数来让高版本的成员保持与其它成员组协议一致。

    请点击输入图片描述

出访波R0
2018-05-07 · TA获得超过1202个赞
知道小有建树答主
回答量:347
采纳率:40%
帮助的人:61万
展开全部
2、存储过程没返回值,参数可以是 IN,OUT,IN OUT类型,有的人可能会理解成OUT 也算是返回值。
3、调用方式:函数 select my_fun() ;过程 call my_pro( ) ;
4、DEMO

1
2
3
4
5
6
7
8
9
10
11

DELIMITER $$
DROP FUNCTION IF EXISTS my_fun$$
CREATE
FUNCTION my_fun(a INT(2),b INT(2))
RETURNS INT(4)
BEGIN
DECLARE sum_ INT(2) DEFAULT 0;
SET sum_ = a + b;
RETURN sum_;
END$$
DELIMITER ;

1
2
3
4
5
6
7
8

DELIMITER $$
DROP PROCEDURE IF EXISTS my_pro$$
CREATE
PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))
BEGIN
SET c = a + b;
END$$
DELIMITER ;

5、调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

mysql> call my_pro(1,2,@c);
Query OK, 0 rows affected (0.00 sec)

mysql> select @c;
+------+
| @c |
+------+
| 3 |
+------+
1 row in set (0.00 sec)

mysql> select my_fun(1,2);
+-------------+
| my_fun(1,2) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式