在mysql数据库中存储函数不能向调用方返回结果值

在mysql数据库中存储函数不能向调用方返回结果值,第1张

可以,存储过程只是把你的查询语句形成一个固定的格式,这样你要查询的时候就不用每次都执行查询语句了,sql在执行的时候都会将你的sql语句转换为字节码,然后机器才能运行,存储过程就节省了这一步,已经形成了字节码,所以速度才会快,特别是执行次数比较多的时候,可以节省很多时间

背景

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

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

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

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

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

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

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

例如:

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

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

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

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

新增 UDF

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

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

1 group_replication_set_communication_protocol(new_protocol)

设置组复制通讯协议版本

SELECT group_replication_set_communication_protocol("8015");


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

new_protocol 格式:majorminorpatch (主版本号次版本号发布版本号)例如:8015。

2 group_replication_get_communication_protocol()

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

SELECT group_replication_get_communication_protocol();    +------------------------------------------------+    | group_replication_get_communication_protocol() |    +------------------------------------------------+    | 5714                                         |    +------------------------------------------------+


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

返回结果格式:majorminorpatch (主版本号次版本号发布版本号)例如:8015。

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

结论

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

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

CREATE PROCEDURE [CHARACTER]
@a varchar(20),@b varchar(20),@c varchar(20) output
AS
declare @d int
--begin
select @d=charindex(@a,@b,1)
print @d
if @d=1
begin
set @c='一样'
print @c
end
else
begin
set @c='不同'
print @c
end
GO
在查询分析器中:[CHARACTER] 'Hello','Hello Word!',''

create function 函数名称(参数列表)
reurns 返回值类型
函数体
执行的方法很简单:
加载
create function <函数名称> returns {string|real|integer}
soname <你定义的动态库位置>
释放!
drop function <函数名称>

mybatis调用mysql存储过程(返回参数,单结果集,多结果集)

注: RETCODE、RETDESC 这里的输出值不用在函数里 SELECT RETCODE; ,因为即使没有,当执行成功后会自动返回在对象里(Object/Map),所以在函数里不用SELECT一下了。

Navicat中执行函数需要输入参数值,也是对应图1,@A@B表示输出值。(一个输入值两个输出值)

1 标注一二三四五处如果存在,则执行成功后返回结果如下

标注一对应结果1
标注二对应结果2
标注三对应结果3
标注四对应结果4
标注五对应结果5
其中结果3返回的是集合。
存在这么多结果,想要取结果3中的集合是不好取的,只有像下图一样只有一个结果才好取出集合。

2 标注一二四五处如果不存在,则执行成功后返回结果如下

只有结果1,对应的是标注三处的值。可以取出集合

函数p_duplicate_enroll

背景

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

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

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

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

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

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

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

例如:

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

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

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

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

新增 UDF

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

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

1 group_replication_set_communication_protocol(new_protocol)

设置组复制通讯协议版本

SELECT group_replication_set_communication_protocol("8015");


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

new_protocol 格式:majorminorpatch (主版本号次版本号发布版本号)例如:8015。

2 group_replication_get_communication_protocol()

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

SELECT group_replication_get_communication_protocol();    +------------------------------------------------+    | group_replication_get_communication_protocol() |    +------------------------------------------------+    | 5714                                         |    +------------------------------------------------+


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

返回结果格式:majorminorpatch (主版本号次版本号发布版本号)例如:8015。

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

结论

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

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

给你个例子
drop procedure if exists call proc_temp;
delimiter $ //存储过程从$ 开始
create procedure proc_temp(
IN startDate VARCHAR(20),//设置传入的变量,没有可以不要传
IN endDate VARCHAR(20))
BEGIN
DECLARE dflag INT(11); //这里可以定义你需要的仅在存储过程里使用的变量
SET dflag = 0;//初始化
select from table where time between startDate and endDate ;//你的sql语句,可以一句可以多句
END $//存储过程从$ 结束
delimiter ;
当上面的选中运行后没问题,可以选中下面的call xx 运行,上面的代码没有改动的话只需要运行一次
call proc_temp("2017-07-05","2017-08-05")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13408946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存