在 Aurora PostgreSQL 中处理动态 SQL 语句中的匿名块 - AWS Prescriptive Guidance

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

在 Aurora PostgreSQL 中处理动态 SQL 语句中的匿名块

创建者:anuradha chintha (AWS)

环境:PoC 或试点

源:数据库关系

目标:PostgreSQL

R 类型:重构

工作负载:Oracle;开源

技术:数据库;迁移

Amazon Web Services:Amazon Aurora;Amazon RDS

Summary

此模式向您展示了如何避免在处理动态 SQL 语句中的匿名块时出现的错误。当您使用 AWS Schema Conversion Tool 将 Oracle 数据库转换为 Aurora PostgreSQL-Compatible Edition 数据库时,您会收到一条错误消息。为避免错误,必须知道 OUT 绑定变量的值,但是要等到运行 SQL 语句之后才能知道 OUT 绑定变量的值。该错误是由于 AWS Schema Conversion Tool(AWS SCT)不理解动态 SQL 语句中的逻辑造成的。AWS SCT 无法转换 PL/SQL 代码(即函数、过程和软件包)中的动态 SQL 语句。

先决条件和限制

先决条件

架构

源技术堆栈

  • 本地 Oracle 数据库 10g 及更高版本

目标技术堆栈

  • Amazon Aurora PostgreSQL

  • Amazon RDS for PostgreSQL

  • AWS Schema Conversion Tool (AWS SCT)

迁移架构

下图显示了如何使用 AWS SCT 和 Oracle OUT 绑定变量来扫描应用程序代码中是否存在嵌入式 SQL 语句,并将代码转换为 Aurora 数据库可以使用的兼容格式。

使用 AWS SCT 和 Oracle OUT 绑定变量的架构图

图表显示了以下工作流:

  1. 使用 Aurora PostgreSQL 作为目标数据库,为源数据库生成 AWS SCT 报告。

  2. 识别动态 SQL 代码块中的匿名块(AWS SCT 对此提出了错误)。

  3. 手动转换代码块并将代码部署到目标数据库上。

工具

Amazon Web Services

其他工具

  • pgAdmin 允许您连接数据库服务器并与之交互。

  • Oracle SQL Developer 是一个集成的开发环境,您可以使用它来开发和管理 Oracle 数据库中的数据库。您可以使用 SQL *Plus 或 Oracle SQL Developer 来实现这种模式。

操作说明

任务描述所需技能

在 Amazon RDS 或 Amazon EC2 上创建 Oracle 实例。

要在 Amazon RDS 上创建 Oracle 数据库实例,请参阅 Amazon RDS 文档中的创建 Oracle 数据库实例并连接到 Oracle 数据库实例上的数据库

要在 Amazon Elastic Compute Cloud(Amazon EC2)上创建 Oracle 数据库实例,请参阅 AWS Prescriptive Guidance 文档中的适用于 Oracle 的 Amazon EC2

数据库管理员

创建用于迁移的数据库架构和对象。

您可以使用 Amazon Cloud Directory 创建数据库架构。有关更多信息,请参阅 Cloud Directory 文档中的创建架构

数据库管理员

配置入站和出站安全组。

要创建和配置安全组,请参阅 Amazon RDS 文档中的使用安全组控制访问权限

数据库管理员

确认数据库正在运行。

要检查数据库的状态,请参阅 Amazon RDS 文档中的查看 Amazon RDS 事件

数据库管理员
任务描述所需技能

在 Amazon RDS 中创建 Aurora PostgreSQL 实例。

要创建 Aurora PostgreSQL 数据库实例,请参阅 Amazon RDS 文档中的创建数据库集群并连接到 Aurora PostgreSQL 数据库集群上的数据库

数据库管理员

配置入站和出站安全组。

要创建和配置安全组,请参阅 Aurora 文档中的通过创建安全组提供对 VPC 中数据库集群的访问

数据库管理员

确认 Aurora PostgreSQL 数据库正在运行。

要检查数据库的状态,请参阅 Aurora 文档中的查看 Amazon RDS 事件

数据库管理员
任务描述所需技能

将 AWS SCT 连接到源数据库。

要将 AWS SCT 连接到源数据库,请参阅 AWS SCT 文档中的作为源连接到 PostgreSQL

数据库管理员

将 AWS SCT 连接到目标数据库。

要将 AWS SCT 连接到目标数据库,请参阅 AWS Schema Conversion Tool 用户指南中的什么是 AWS Schema Conversion Tool?

数据库管理员

在 AWS SCT 中转换数据库架构,并将自动转换后的代码保存为 SQL 文件。

要保存 AWS SCT 转换后的文件,请参阅 AWS Schema Conversion Tool 用户指南中的在 AWS SCT 中保存和应用转换后的架构

数据库管理员
任务描述所需技能

获取用于手动转换的 SQL 文件。

在 AWS SCT 转换后的文件中,提取需要手动转换的 SQL 文件。

数据库管理员

更新脚本。

手动更新 SQL 文件。

数据库管理员

相关资源

其他信息

下面的示例代码显示了如何配置 Oracle 源数据库:

CREATE or replace PROCEDURE calc_stats_new1 ( a NUMBER, b NUMBER, result out NUMBER) IS BEGIN result:=a+b; END; /
set serveroutput on ; DECLARE a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); output number; BEGIN plsql_block := 'BEGIN calc_stats_new1(:a, :b,:output); END;'; EXECUTE IMMEDIATE plsql_block USING a, b,out output; DBMS_OUTPUT.PUT_LINE('output:'||output); END;

下面的示例代码显示了如何配置 Aurora PostgreSQL 目标数据库:

w integer, x integer) RETURNS integer AS $BODY$ DECLARE begin return w + x ; end; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION test_pg.init() RETURNS void AS $BODY$ BEGIN if aws_oracle_ext.is_package_initialized ('test_pg' ) then return; end if; perform aws_oracle_ext.set_package_initialized ('test_pg' ); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_output', NULL::INTEGER); PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_status', NULL::text); END; $BODY$ LANGUAGE plpgsql; DO $$ declare v_sql text; v_output_loc int; a integer :=1; b integer :=2; BEGIN perform test_pg.init(); --raise notice 'v_sql %',v_sql; execute 'do $a$ declare v_output_l int; begin select * from test_pg.calc_stats_new1('||a||','||b||') into v_output_l; PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; end; $a$' ; v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output'); raise notice 'v_output_loc %',v_output_loc; END ; $$