一种基于数据库的UPDATE语句中变量赋值的方法及系统与流程

摘要: 本技术涉及数据库迁移,具体涉及一种基于数据库的update语句中变量赋值的方法、系统、计算机可读存储介质以及电子设备。背景技术:1、在sqlserver数据库系...
一种基于数据库的UPDATE语句中变量赋值的方法及系统与流程

本技术涉及数据库迁移,具体涉及一种基于数据库的update语句中变量赋值的方法、系统、计算机可读存储介质以及电子设备。

背景技术:

1、在sql server数据库系统中,update语句的set子句除支持标准的数据列更新语法外,还扩展支持用户变量赋值语法,允许用户在同一条update语句中同时完成数据更新和变量赋值操作,即将列表达式的计算结果赋给会话级用户变量(以“@”为前缀),供后续语句引用。该语法特性使得数据更新与变量赋值操作能够原子化地合并执行,能够将原本需要多次网络交互、重复计算或大量数据传输的操作,封装为数据库内部的单次高效执行,减少了应用程序与数据库之间的交互次数,降低了多次查询或计算带来的网络开销与上下文切换成本,在存储过程逻辑简化、行列动态转换、批量数据清洗与标准化等业务场景中展现出显著的性能优势与编码便利性。

2、opengauss作为一款开源关系型数据库管理系统,为降低用户从异构数据库迁移的成本,提供了多种兼容模式,其中mssql模式旨在兼容sql server的语法特性。然而,当前opengauss在该模式下,update语句的set子句仍严格遵循标准sql规范,仅支持对数据表列进行赋值,尚未支持sql server风格的“@变量”赋值语法。因此,当用户将原有sql server业务系统迁移至opengauss时,所有涉及update set中变量赋值的sql语句均无法直接执行,必须手工改写为多条独立语句(如先执行select赋值、再执行update更新,或使用存储过程拆分),以实现等价逻辑。

3、上述改写方式不仅显著增加了迁移工作量和迁移成本,降低了代码的可读性与可维护性,而且破坏了原有一条语句的原子性语义,可能引入并发一致性问题;同时,多次语句执行导致执行计划无法复用,整体执行效率下降,尤其在批量数据处理场景中性能劣化更为突出。因此,在opengauss中实现对update语句set子句内变量赋值语法的原生支持,对于sql server用户平滑迁移、保障业务逻辑高效运行,具有重要的现实需求和应用价值。

技术实现思路

1、为了克服现有技术中存在的上述缺陷,本技术提出了一种新的基于数据库的update语句中变量赋值的方法及系统,旨在实现兼容现有语法体系的同时,确保语义正确性、执行效率与系统稳定性,降低opengauss等数据库的迁移成本,并提升查询性能。

2、具体而言,本技术提供了以下技术方案:

3、本技术的第一方面提供一种基于数据库的update语句中变量赋值的方法,所述方法应用于opengauss数据库系统,如图1所示,所述方法包括以下步骤:

4、s1:接收update set语句,在mssql兼容模式下识别set子句中的会话变量标识,生成对应的变量令牌并存储变量名;

5、s2:遍历目标列表,为目标列表中的每个目标项设置变量标识和变量索引,以区分变量赋值与列赋值;

6、s3:将目标项保存至变量列表,并跳过表列更新检查;

7、s4:重排目标列表,使变量赋值操作位于列赋值操作之前,且各变量赋值之间的相对顺序保持不变;

8、s5:调用表达式求值接口计算各变量的赋值结果;

9、s6:通过回调钩子函数将所述赋值结果回写至对应的会话变量中;

10、s7:执行列赋值操作,完成update语句的数据更新。

11、进一步地,本技术方法中,步骤s1中所述识别set子句中的会话变量标识,具体包括:扫描读取@字符,在确定当前为mssql兼容模式、存在以@为前缀的变量名且变量名长度大于1时,生成set_user_ident令牌,并在yylval中存储所述变量名。

12、进一步地,本技术方法中,步骤s2中所述设置变量标识和变量索引,具体包括:在restarget结构体中新增is_variable字段和variable_no字段,is_variable为布尔类型,用于标识是否存在会话变量赋值,variable_no为整型,用于记录datums数组下标;将restarget结构体中的is_variable和variable_no赋值至targetentry结构体,以区分变量赋值与列赋值。

13、进一步地,本技术方法中还包括:在plsql引擎执行器中,禁止优化器将所述会话变量优化为常量;以及,在plsql引擎执行器中实现所述回调钩子函数,以供sql引擎执行器回调。

14、进一步地,本技术方法中,当所述update set语句为动态sql时,步骤s1之前还包括:在满足mssql兼容模式、解析树为updatestmt、存在参数列表且update set语句中包含会话变量的条件下,临时切换至plpgsql_parser_setup钩子函数以识别会话变量,识别完成后还原钩子函数,并通过setup_param_list向参数列表补充变量信息。

15、进一步地,本技术方法中还包括版本兼容处理步骤:在targetentry结构体新增字段后,在节点的读取、写入、拷贝和比较阶段进行版本适配,以支持数据库升级与回退。

16、本技术的第二方面提供一种基于数据库的update语句中变量赋值的系统,所述系统运行时实现前述的基于数据库的update语句中变量赋值的方法的步骤,如图2所示,所述系统包括:

17、输入模块,用于接收update set语句;

18、解析层,包括词法分析模块和语义分析模块,所述词法分析模块用于在mssql兼容模式下识别set子句中的会话变量标识,生成对应的变量令牌并存储变量名;所述语义分析模块用于遍历目标列表,为目标列表中的每个目标项设置变量标识和变量索引,以区分变量赋值与列赋值,并将目标项保存至变量列表,跳过表列更新检查;

19、执行层,包括sql引擎执行器和plsql引擎执行器,所述sql引擎执行器用于重排目标列表使变量赋值操作位于列赋值操作之前且相对顺序保持不变,调用表达式求值接口计算各变量的赋值结果,并通过回调钩子函数将所述赋值结果回写至对应的会话变量中,然后执行列赋值操作完成数据更新;所述plsql引擎执行器用于实现所述回调钩子函数,并禁止优化器将所述会话变量优化为常量;

20、公共基础设施层,用于在结构体字段变更后进行版本兼容适配;

21、输出模块,用于输出更新后的数据。

22、进一步地,本技术系统中,所述词法分析模块具体用于:扫描读取@字符,在确定当前为mssql兼容模式、存在以@为前缀的变量名且变量名长度大于1时,生成set_user_ident令牌,并在yylval中存储所述变量名;

23、所述语义分析模块具体用于:在restarget结构体中新增is_variable字段和variable_no字段,is_variable为布尔类型,用于标识是否存在会话变量赋值,variable_no为整型,用于记录datums数组下标;将restarget结构体中的is_variable和variable_no赋值至targetentry结构体,以区分变量赋值与列赋值。

24、进一步地,本技术系统中,所述sql引擎执行器还用于:当所述update set语句为动态sql时,在满足mssql兼容模式、解析树为updatestmt、存在参数列表且update set语句中包含会话变量的条件下,临时切换至plpgsql_parser_setup钩子函数以识别会话变量,识别完成后还原钩子函数,并通过setup_param_list向参数列表补充变量信息。

25、进一步地,本技术系统中,所述公共基础设施层具体用于:在targetentry结构体新增字段后,在节点的读取、写入、拷贝和比较阶段进行版本适配,以支持数据库升级与回退。

26、本技术的第三方面提供一种电子设备,包括:存储器和处理器;

27、存储器:用于存储计算机程序;

28、处理器:用于执行所述计算机程序,以实现前述的基于数据库的update语句中变量赋值的方法的步骤。

29、本技术的第四方面提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现前述的基于数据库的update语句中变量赋值的方法的步骤。

30、综上,本发明通过在opengauss数据库的update语句set子句中扩展会话变量赋值语法,实现了以下技术优势及有益效果:

31、1、降低迁移成本,提升兼容性

32、在mssql兼容模式下原生支持sql server风格的@变量赋值语法,使涉及updateset变量赋值的sql语句无需手动拆分为多条语句即可直接执行,显著减少了从sql server向opengauss迁移时的代码改写工作量,降低了迁移门槛与维护成本。

33、2、简化业务逻辑,提升执行效率

34、将原本需要多次客户端-服务器交互、重复表达式计算的操作封装为数据库内部的单次执行,减少了网络往返开销与计算冗余,在存储过程逻辑简化、行列转换、批量数据清洗等场景中有效提升了查询性能。

35、3、保证语义正确性与执行稳定性

36、通过重排目标列表确保变量赋值先于列赋值执行,并复用原有表达式求值接口计算变量结果,在兼容现有语法体系的同时,借助plsql引擎中的钩子回调机制实现变量回写,解耦了sql引擎与plsql引擎,保障了语义正确性与系统稳定性。

37、4、支持动态sql与版本兼容

38、通过临时切换钩子函数识别动态sql中的会话变量,扩展了语法适用场景;同时针对结构体字段变更进行版本适配,确保数据库升级与回退过程中的兼容性。

39、本技术的其他特征和优点将在随后的说明书中予以详细阐述,或者通过实施本技术的相关技术方案而得以了解。本技术的目的以及其他优点可以通过说明书、权利要求书以及附图中所明确指出的技术特征和技术手段来实现,并通过这些技术内容的实施过程而获得。