在 Aurora Post SQL gre 中处理过载的 Oracle 函数——兼容 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Aurora Post SQL gre 中处理过载的 Oracle 函数——兼容

由 Sumana Yanamandra 创作 () AWS

环境:PoC 或试点

源:Oracle 数据库

目标:Aurora Postgre SQL-兼容

R 类型:更换平台

工作负载:Oracle

技术:数据库;迁移

AWS服务:亚马逊 Aurora

Summary

您从本地 Oracle 数据库迁移到 Amazon Aurora Postgre SQL 兼容版的代码可能包含过载的函数。这些函数具有相同的定义,即相同的函数名称以及相同的输入 (IN) 参数数量和数据类型,但输出 (OUT) 参数的数据类型或数量可能会有所不同。 

这些参数不匹配可能会导致 Postgre 出现问题SQL,因为很难确定要运行哪个函数。此模式说明了在将数据库代码迁移到 Aurora Postgre SQL-Compatible 时如何处理过载的函数。

先决条件和限制

先决条件

  • 作为源数据库的 Oracle 数据库实例

  • 将SQL兼容 Aurora Postgre 的数据库实例作为目标数据库(参见 Aurora 文档中的说明

产品版本

工具

AWS服务

其他工具

  • Oracle SQL 开发人员是一个免费的集成开发环境,可在传统部署和云部署中在 Oracle 数据库中使用SQL。 

  • pgAdmin是 Postgre SQL 的开源管理工具。它提供了一个图形界面,可帮助您创建、维护和使用数据库对象。

操作说明

任务描述所需技能
在 Postgre 中创建一个SQL具有一个输入参数和一个输出参数的函数。

以下示例说明了在 Aurora Postgre SQL-Compatible test_overloading 中名为的函数。此函数有两个参数:一个输入文本参数和一个输出文本参数。

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text)     LANGUAGE 'plpgsql'     COST 100     VOLATILE AS $BODY$ DECLARE BEGIN          str2 := 'Success';     RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
数据工程师,Aurora Postgre SQL-兼容
在 Postg SQL re 中运行该函数。

运行您在上一步中创建的函数。

select public.test_overloading('Test');

应显示以下输出。

Success
数据工程师,Aurora Postgre SQL-兼容
任务描述所需技能
在 Post SQL gre 中使用相同的函数名称创建重载函数。

在 Aurora Postgre SQL-Compatible 中创建一个重载函数,该函数使用与之前的函数名称相同的函数名称。以下示例也被命名 test_overloading,但它具有三个参数:一个输入文本参数、一个输出文本参数和一个输出整数参数。

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text;   BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
数据工程师,Aurora Postgre SQL-兼容
在 Postg SQL re 中运行该函数。

当您运行此函数时,它会失败并显示以下错误消息。 

ERROR: cannot change return type of existing function HINT:      Use DROP FUNCTION test_overloading(text) first.

之所以发生这种情况,是因为 Aurora Postgre SQL-Compatible 不支持直接重载函数。它无法确定要运行哪个函数,因为尽管输入参数相同,但函数的第二个版本中的输出参数数量不同。

数据工程师,Aurora Postgre SQL-兼容
任务描述所需技能
INOUT添加到第一个输出参数。

解决方法是,通过将第一个输出参数表示为 INOUT 来修改函数代码。

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          INOUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text; BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
数据工程师,Aurora Postgre SQL-兼容
运行修改后的函数。

使用以下查询运行已更新的函数。您传递一个空值作为此函数的第二个参数,因为您声明此参数为 INOUT 以避免错误。 

select public.test_overloading('Test', null);

该函数现已成功创建。

Success, 100
数据工程师,Aurora Postgre SQL-兼容
验证结果。

验证带有重载函数的代码是否已成功转换。

数据工程师,Aurora Postgre SQL-兼容

相关资源