本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Aurora Postgre 中处理动态SQL语句中的匿名块 SQL
由 anuradha chintha 创作 () AWS
摘要
此模式向您展示了如何避免在处理 Dynamic SQL 语句中的匿名块时出现的错误。当你使用 Schema Conversion Tool 将 Oracle AWS 数据库转换为 Aurora Postgre SQL 兼容版数据库时,你会收到一条错误消息。为避免错误,必须知道OUT
绑定变量的值,但是要等到运行该SQL语句之后才能知道OUT
绑定变量的值。该错误是由于 AWS Schema Conversion Tool (AWSSCT) 不理解动态SQL语句中的逻辑造成的。 AWSSCT无法转换 PL/ SQL 代码(即函数、过程和包)中的动态SQL语句。
先决条件和限制
先决条件
活跃AWS账户
适用于 Oracle 数据库实例的亚马逊 Relational Database Service (AmazonRDS)
AWS_ORACLE_EXT
目标数据库中的架构(AWSSCT扩展包的一部分)最新版本的 AWSSchema Conversion Tool (AWSSCT)
及其所需的驱动程序
架构
源技术堆栈
本地 Oracle 数据库 10g 及更高版本
目标技术堆栈
亚马逊 Aurora Postgre SQL
适用于 Post RDS gre 的亚马逊 SQL
AWSSchema Conversion Tool (AWSSCT)
迁移架构
下图显示了如何使用AWSSCT和 Oracle OUT
绑定变量来扫描应用程序代码中是否存在嵌入式SQL语句,并将代码转换为 Aurora 数据库可以使用的兼容格式。

图表显示了以下工作流:
使用 Aurora Postgre SQL 作为目标数据库,为源数据库生成AWSSCT报告。
识别动态SQL代码块中的匿名块(该代码块AWSSCT引发了错误)。
手动转换代码块并将代码部署到目标数据库上。
工具
AWS 服务
Amazon Aurora Postgre SQL 兼容版是一款完全托管、ACID兼容的关系数据库引擎,可帮助您设置、操作和扩展 Postgre 部署。SQL
适用于 Oracle 的 Amazon Relational Database Service(亚马逊RDS)可帮助您在AWS云中设置、操作和扩展 Oracle 关系数据库。
AWSSchema Conversion Tool (AWSSCT)
通过自动将源数据库架构和大部分数据库代码对象转换为与目标数据库兼容的格式,帮助您实现异构数据库迁移的可预测性。
其他工具
pgAdmin
使您能够连接到数据库服务器并与之交互。 Oracle SQL 开发人员
是一个集成的开发环境,您可以使用它来开发和管理 Oracle 数据库中的数据库。你可以使用 SQL*Plus 或 Oracle Develo SQL per 来实现这种模式。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
在亚马逊RDS或亚马逊上创建 Oracle 实例EC2。 | 要在亚马逊上创建 Oracle 数据库实例RDS,请参阅亚马逊RDS文档中的创建 Oracle 数据库实例并连接到 Oracle 数据库实例上的数据库。 要在亚马逊弹性计算云 (亚马逊EC2) 上创建 Oracle 数据库实例,请参阅AWS规范性指南文档中的 Amazon EC2 for Oracle。 | DBA |
创建用于迁移的数据库架构和对象。 | 您可以使用 Amazon Cloud Directory 创建数据库架构。有关更多信息,请参阅 Cloud Directory 文档中的创建架构。 | DBA |
配置入站和出站安全组。 | 要创建和配置安全组,请参阅 Amazon RDS 文档中的使用安全组控制访问权限。 | DBA |
确认数据库正在运行。 | 要检查数据库的状态,请参阅亚马逊RDS文档中的查看亚马逊RDS事件。 | DBA |
任务 | 描述 | 所需技能 |
---|---|---|
在亚马逊RDS上创建 Aurora Postgre SQL 实例。 | 要创建 Aurora Postgre SQL 实例,请参阅亚马逊RDS文档中的在 Aurora Postgre 数据库集群上创建SQL数据库集群并连接数据库。 | DBA |
配置入站和出站安全组。 | 要创建和配置安全组,请参阅 Aurora 文档中的VPC通过创建安全组来提供对数据库集群的访问权限 | DBA |
确认 Aurora Postgre SQL 数据库正在运行。 | 要检查数据库的状态,请参阅 Aurora 文档中的查看亚马逊RDS事件 | DBA |
任务 | 描述 | 所需技能 |
---|---|---|
Connect AWS SCT 连接到源数据库。 | 要AWSSCT连接到您的源数据库,请参阅AWSSCT文档中的SQL作为源连接到 Postgre。 | DBA |
Connect AWS SCT 连接到目标数据库。 | 要AWSSCT连接到目标数据库,请参阅什么是 S AWS chema Conversion Tool? 在 AWS Schema Conversion Tool 用户指南中。 | DBA |
转换数据库架构,AWSSCT并将自动转换后的代码保存为SQL文件。 | 要保存AWSSCT转换后的文件,请参阅 Schema Conversion Tool 用户指南AWSSCT中的保存和应用转换后的AWS架构。 | DBA |
任务 | 描述 | 所需技能 |
---|---|---|
获取SQL文件进行手动转换。 | 在AWSSCT转换后的文件中,提取需要手动转换的SQL文件。 | DBA |
更新脚本。 | 手动更新SQL文件。 | DBA |
相关资源
其他信息
下面的示例代码显示了如何配置 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 Postgre SQL 数据库:
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 ;
$$