将 Oracle DBMSLOB 和集合转换为 Amazon RDS for PostgreSQL
将 Oracle DBMSLOB 和集合转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL
关键要点
许多组织希望从商业关系型数据库如 Oracle迁移到开源数据库如 PostgreSQL。在 Oracle 到 PostgreSQL 的迁移过程中,数据库结构、代码及存储对象如程序包、过程、函数和触发器的转换是最耗时且复杂的部分。Oracle 提供的 LOB 数据类型如 BLOB 和 CLOB,以及特定的数据类型如 varrays 和 associative arrays,在 PostgreSQL 中没有直接的等效项。使用 AWS Schema Conversion ToolAWS SCT及其扩展包,能够手动将复杂的 Oracle 代码对象转换为 PostgreSQL 兼容的形式。简介
许多组织希望从商业关系型数据库如 Oracle迁移到开源数据库如 PostgreSQL。在从 Oracle 迁移到 PostgreSQL 的过程中,最耗时且复杂的部分就是转换数据库结构、代码和存储对象,如程序包、过程、函数和触发器。
1小时试用加速器当从 Oracle 转换或现代化到 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版 时,由于 PostgreSQL 中没有对应的原生函数,代码转换可能会变得更加复杂和具有挑战性。
例如,Oracle 数据库提供 LOB大对象数据类型,如 BLOB 和 CLOB。为了操作这些数据类型,Oracle 提供了原生的 DBMSLOB 包,提供了可以访问和操作 LOB 的特定部分的子程序。
Oracle 数据库具有特定的数据类型,如 varrays可变大小数组,用于将元素的数量作为一个单一对象存储,以及 associative arrays以前称为 PL/SQL 表或索引集,用于存储复杂的键值对,但 PostgreSQL 并没有原生的与 Oracle DBMSLOB 类似的包或函数来与 LOB 进行交互,也没有类似于 Oracle 集合的数据类型。
您可以使用 AWS Schema Conversion Tool (AWS SCT) 和 AWS SCT 扩展包 手动将复杂的 Oracle 代码对象转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL。
本文将说明如何使用 AWS SCT、AWS SCT 扩展包以及手动代码转换,将包含 DBMSLOB 过程和 Oracle 集合例如 varrays 和 associative arrays的 Oracle 代码对象转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 的等效代码。
解决方案概述
在本解决方案中,我们取了一段包含 DBMSLOB 包的 Oracle 代码示例,该包用于写入和附加 LOB 对象。示例中还包括如 varrays 和 associative arrays 之类的数据类型,用于存储变量的值。
我们将阐明如何将此示例 Oracle 代码转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL,从而帮助您在遇到类似复杂代码时进行模拟和转换。
以下图表提供了解决方案的概览。
该工作流包括以下高层步骤:
使用包含带有 DBMSLOB 和 Oracle 集合的示例过程的源 Oracle 数据库。运行 AWS SCT 转换 Oracle 代码,部分转换代码并可能出现错误。使用 AWS SCT 扩展包 及 awsoracleext 模式进行手动代码转换。将完成的转换代码应用并部署到目标 RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 数据库。先决条件
完成以下先决步骤:
创建一个源 Oracle 数据库如果尚未创建。创建一个 Amazon Aurora PostgreSQL 集群或一个 RDS for PostgreSQL 实例如果尚未创建。有关说明,请参阅 创建 Aurora PostgreSQL DB 集群 或 创建 PostgreSQL DB 实例。确保安装了数据库客户端软件,以连接到源和目标数据库。在源和目标数据库中创建 demouser 模式。在源 Oracle 数据库中创建数据库对象
完成以下步骤以设置源表:
创建一个空表:
sqlCREATE TABLE DEMOUSERPRODUCTTBL (ID NUMBER(80) PRDNM VARCHAR2(25 BYTE) STOCK CLOB Details CLOB)
创建 updateproductdetails 过程,该过程将产品 ID、产品名称、交货期和三种产品的详细文本插入到 demouserproducttbl 表中:
sql create or replace procedure demouserupdateproductdetails as type tprdnames is varray(3) of varchar2(20) not null tprd tprdnames = tprdnames(MobileTabletLaptop)
TYPE delsch IS TABLE OF VARCHAR2(64) INDEX BY VARCHAR2(10) vdelsch delsch
DETCLOB CLOB DETTXT CLOB vamount number(8) voffset number(2)
begin vdelsch(Laptop) = Ready for Delivery in 3 days vdelsch(Tablet) = Ready for Delivery in 7 days vdelsch(Mobile) = Ready for Delivery in 5 days vamount = 6 voffset = 1
for i in 13 loop DBMSLOBCREATETEMPORARY(DETCLOB TRUE) DBMSLOBOPEN(DETCLOB DBMSLOBLOBREADWRITE) if tprd(i) = Mobile then DBMSLOBWRITE(DETCLOBvamount voffsettprd(i)) DETTXT = 是一种便携式电话,可以通过无线电频率链接在用户移动于电话服务区域内时打电话和接听电话,而不是固定位置的电话坐机。 DBMSLOBWRITEAPPEND(DETCLOB LENGTH(DETTXT) DETTXT) insert into demouserproducttbl values (itprd(i)vdelsch(tprd(i))DETCLOB) end if if tprd(i) = Tablet then DBMSLOBWRITE(DETCLOBvamount voffsettprd(i)) DETTXT = 是一种移动设备,通常配有移动操作系统和触摸屏显示处理电路,以及在单一、纤薄且平坦的包装中集成充电电池。 DBMSLOBWRITEAPPEND(DETCLOB LENGTH(DETTXT) DETTXT) insert into demouserproducttbl values (itprd(i)vdelsch(tprd(i))DETCLOB) end if if tprd(i) = Laptop then DBMSLOBWRITE(DETCLOBvamount voffsettprd(i)) DETTXT = 被称为笔记本电脑是一种小型、可移动的个人计算机PC。 DBMSLOBWRITEAPPEND(DETCLOB LENGTH(DETTXT) DETTXT) insert into demouserproducttbl values (itprd(i)vdelsch(tprd(i))DETCLOB) end if end loop end
此过程循环遍历 varrays 中列出的每个产品名称,读取该产品的交货期详情如关联数组中列出,使用 DBMSLOB 子程序制定产品的详细文本,并最终将其作为记录插入 demouserproducttbl 表中。
在此过程中,varray 用于列出产品名称,赋值为 tprdnames(MobileTabletLaptop),而关联数组用于设置特定产品的交货时间,比如以下:

sql vdelsch(Laptop) = Ready for Delivery in 3 days vdelsch(Tablet) = Ready for Delivery in 7 days vdelsch(Mobile) = Ready for Delivery in 5 days
dbmslobwrite 子程序从 voffset 值默认为 1开始将产品名称写入 DETCLOB 缓冲区,并写入最多由 vamount 变量指定的字节数量:
sql DBMSLOBWRITE(DETCLOBvamount voffsettprd(i))
dbmslobwriteappend 子程序将每个产品名称的文本附加为 DETTXT 变量指定的值,并制定产品的详细文本:
sql DBMSLOBWRITEAPPEND(DETCLOB LENGTH(DETTXT) DETTXT)
插入到 demouserproducttbl 表中的记录包括产品 ID、名称、交货期和产品详细文本:
sql insert into demouserproducttbl values (itprd(i)vdelsch(tprd(i))DETCLOB)
运行该过程并查询表:sql SQLgt select from demouserproducttbl no rows returned SQLgt call demouserupdateproductdetails() PL/SQL procedure completed successfully SQLgt select from demouserproducttbl
配置 AWS SCT在您完成 Oracle 源数据库的前面步骤后,下一步是 安装 AWS SCT 到您的本地或集中服务器。安装完 AWS SCT 后,下载 Oracle 和 PostgreSQL 数据库 驱动程序,并更新 AWS SCT 以连接到源和目标数据库。
成功连接到两个数据库后,在 AWS SCT 中创建 映射规则 并将 awsoracleext 扩展包应用到目标 PostgreSQL 数据库。在转换 架构 时,AWS SCT 工具将在左侧窗格中显示源数据库上的 demouser 模式。选择右键点击源中的 demouser 模式并选择 Convert schema。AWS SCT 将在 PostgreSQL 中生成等效代码。您可以查看转换后的过程并将更改应用到目标数据库。
在转换过程中,AWS SCT将在目标的 RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 数据库中的 demouser 模式创建一个 producttbl 表、一个 updateproductdetailsdelschc 类型和一个 updateproductdetails() 过程。
AWS SCT 为 PostgreSQL 表和类型创建以下 DDL:
sql CREATE TABLE demouserproducttbl ( id numeric(8) NULL prdnm varchar(25) NULL stock text NULL details text NULL )
CREATE TYPE demouserupdateproductdetailsdelschc AS (columnvalue varchar(64))
然后它创建了转换后的包,如下所示。请注意,AWS SCT 提供的注释。
sqlCREATE OR REPLACE PROCEDURE demouserupdateproductdetails() LANGUAGE plpgsqlAS procedureDECLARE awsoracleextarrayidtemporary BIGINT tprd demouserupdateproductdetailstprdnames / [5340 Severity CRITICAL PostgreSQL doesnt support the UPDATEPRODUCTDETAILSTPRDNAMES function Revise your code to use another function or create a userdefined function] = tprdnames(MobileTabletLaptop) / vdelsch VARCHAR(100) = vdelsch DETCLOB TEXT DETTXT TEXT vamount NUMERIC(8) voffset NUMERIC(2)BEGIN awsoracleextarrayidtemporary = awsoracleextarraycreatearray(parrayname =gt vdelsch pprocedurename =gt demouserupdateproductdetails pIndexBy =gt VARCHAR2(10)) PERFORM awsoracleextarrayaddfieldstoarray(parrayid =gt awsoracleextarrayidtemporary pfields =gt [{CHARACTER VARYING(64)}]) PERFORM awsoracleextarraycreatestoragetable(parrayname =gt vdelsch pprocedurename =gt demouserupdateproductdetails pcasttypename =gt demouserupdateproductdetailsdelschc pWithData =gt FALSE) PERFORM awsoracleextarraysetvalue(parraypath =gt vdelsch[Laptop] pprocedurename =gt demouserupdateproductdetails pvalue =gt Ready for Delivery in 3 daysCHARACTER VARYING(64)) PERFORM awsoracleextarraysetvalue(parraypath =gt vdelsch[Tablet] pprocedurename =gt demouserupdateproductdetails pvalue =gt Ready for Delivery in 7 daysCHARACTER VARYING(64)) PERFORM awsoracleextarraysetvalue(parraypath =gt vdelsch[Mobile] pprocedurename =gt demouserupdateproductdetails pvalue =gt Ready for Delivery in 5 daysCHARACTER VARYING(64)) vamount = 6 voffset = 1
FOR i IN 13 LOOP CALL awsoracleextdbmslobcreatetemporary(lobloc =gt DETCLOB) / [5340 Severity CRITICAL PostgreSQL doesnt support the SYSDBMSLOBOPEN(CLOBBINARYINTEGER) function Revise your code to use another function or create a userdefined function] DBMSLOBOPEN(DETCLOB DBMSLOBLOBREADWRITE) / IF tprd(i) = Mobile THEN / [9996 Severity CRITICAL Transformer error occurred in plSqlStatement Please submit report to developers] DBMSLOBWRITE(DETCLOBvamount voffsettprd(i)) / DETTXT = 是一种便携式电话,可以通过无线电频率链接在用户移动于电话服务区域内时打电话和接听电话,而不是固定位置的电话坐机。TEXT CALL awsoracleextdbmslobwriteappend(lobloc =gt DETCLOB amount =gt LENGTH(DETTXTTEXT) buffer =gt DETTXT) / [5030 Severity CRITICAL AWS SCT cant convert the usage of objects with the unsupported Oracle database1xxxxxxxxxxuseast1rdsamazonawscomDEMOUSERUPDATEPRODUCTDETAILSTPRDNAMES data type AWS SCT created a method stub To replace it convert your source code manually] insert into demouserproducttbl values (itprd(i)vdelsch(tprd(i))DETCLOB) / END IF / [5030 Severity CRITICAL AWS SCT cant convert the usage of objects with the unsupported Oracle database1xxxxxxxxuseast1rdsamazonawscomDEMOUSERUPDATEPRODUCTDETAILSTPRDNAMES data type AWS SCT created a method stub To replace it convert your source code manually] if tprd(i) = Tablet then DBMSLOBWRITE(DETCLOBvamount voffsettprd(i)) DETTXT = 是一种移动设备,通常配有移动操作系统和触摸屏显示处理电路,以及在单一、纤薄且平坦的包装中集成充电电池。 DBMSLOBWRITEAPPEND(DETCLOB LENGTH(DETTXT) DETTXT) insert into demouserproducttbl values (itprd(i