

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

# 将 Oracle SERIALLY\$1REUSABLE pragma 包迁移至 PostgreSQL
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi，Amazon Web Services*

## Summary
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-summary"></a>

这种模式提供了 step-by-step一种将定义为 SERIALLY\$1REPLAGMA 的 Oracle 包迁移到亚马逊网络服务 (AWS) 上的 PostgreSQL 的方法。此方法保留了 SERIALLY\$1REUSABLE 编译指示的功能。

PostgreSQL 不支持包的概念和 SERIALLY\$1REUSABLE pragma。要在 PostgreSQL 中获得类似的功能，您可为包创建架构，并在架构中部署所有相关对象（例如函数、过程和类型）。为了实现 SERIALLY\$1REFLEY 编译指示的功能，此模式中提供的示例包装函数脚本使用了 [AWS Schema Conversion Tool (AWS SCT) 扩展包](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_ExtensionPack.html)。

有关更多信息，请参阅 Oracle 文档中的 [SERIALLY\$1REUSABLE Pragma](https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems046.htm)。

## 先决条件和限制
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 最新版本的 AWS SCT 和所需驱动程序
+ Amazon Aurora PostgreSQL 兼容版数据库或 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 数据库 

**产品版本**
+ Oracle 数据库版本 10g 及更高版本

## 架构
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-architecture"></a>

**源技术堆栈**
+ 本地 Oracle 数据库

**目标技术堆栈**
+ [Aurora PostgreSQL 兼容版](https://aws.amazon.com/rds/aurora/details/postgresql-details/)或 Amazon RDS for PostgreSQL
+ AWS SCT

**迁移架构**

![\[本地 Oracle 数据库数据通过 AWS SCT、.sql 文件及手动转换方式迁移至 AWS，最终迁移至 PostgreSQL。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/2dc90708-e300-4251-9d12-de97b6588b72.png)


## 工具
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-tools"></a>

**Amazon Web Services**
+ [AWS Schema Conversion Tool（AWS SCT）](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)通过自动将源数据库架构和大部分自定义代码转换为与目标数据库兼容的格式来支持异构数据库迁移。
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩展 PostgreSQL 部署。
+ [Amazon Relational Database Service（Amazon RDS）for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展PostgreSQL 关系数据库。

**其他工具**
+ [pgAdmin](https://www.pgadmin.org/) 是一种适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。

## 操作说明
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-epics"></a>

### 使用 AWS SCT 迁移 Oracle 软件包
<a name="migrate-the-oracle-package-by-using-aws-sct"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 AWS SCT。 | 配置与源数据库的 AWS SCT 连接。有关更多信息，请参阅[使用 Oracle 数据库作为 AWS SCT 的源](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.html)。 | 数据库管理员、开发人员 | 
| 转换脚本。 | 通过选择与 Aurora PostgreSQL 兼容的目标数据库，通过 AWS SCT 转换 Oracle 软件包。 | 数据库管理员、开发人员 | 
| 保存 .sql 文件。 | 在保存.sql 文件之前，请将 AWS SCT 中的**项目设置**选项修改为**每个阶段单个文件**。AWS SCT 会根据对象类型将 .sql 文件分成多个.sql 文件。 | 数据库管理员、开发人员 | 
| 更改代码。 | 打开 AWS SCT 生成的 `init` 函数，然后按*其他信息*部分的示例所示对其进行更改。它将添加一个变量来实现 `pg_serialize = 0` 功能。 | 数据库管理员、开发人员 | 
| 测试转换。 | 将 `init` 函数部署到与 Aurora PostgreSQL 兼容数据库，然后测试结果。 | 数据库管理员、开发人员 | 

## 相关资源
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS Schema Conversion Tool‭](https://aws.amazon.com/dms/schema-conversion-tool/)
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Amazon Aurora 功能](https://aws.amazon.com/rds/aurora/postgresql-features/)
+ [SERIALLY\$1REUSABLE Pragma](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/seriallyreusable_pragma.htm#LNPLS01346)

## 附加信息
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-additional"></a>

```
Source Oracle Code:

CREATE OR REPLACE PACKAGE test_pkg_var
IS
PRAGMA SERIALLY_REUSABLE;
PROCEDURE function_1
 (test_id number);
PROCEDURE function_2
 (test_id number
 );
END;

CREATE OR REPLACE PACKAGE BODY test_pkg_var
IS
PRAGMA SERIALLY_REUSABLE;
v_char VARCHAR2(20) := 'shared.airline';
v_num number := 123;

PROCEDURE function_1(test_id number)
IS
begin
dbms_output.put_line( 'v_char-'|| v_char);
dbms_output.put_line( 'v_num-'||v_num);
v_char:='test1';
function_2(0);
END;

PROCEDURE function_2(test_id number)
is
begin
dbms_output.put_line( 'v_char-'|| v_char);
dbms_output.put_line( 'v_num-'||v_num);
END;
END test_pkg_var;

Calling the above functions

set serveroutput on


EXEC test_pkg_var.function_1(1);


EXEC test_pkg_var.function_2(1);


Target Postgresql Code:


CREATE SCHEMA test_pkg_var;

CREATE OR REPLACE FUNCTION test_pkg_var.init(pg_serialize IN INTEGER DEFAULT 0)

RETURNS void
AS
$BODY$

DECLARE

BEGIN

if aws_oracle_ext.is_package_initialized( 'test_pkg_var' ) AND pg_serialize = 0

then

return;

end if;

PERFORM aws_oracle_ext.set_package_initialized( 'test_pkg_var' );

PERFORM aws_oracle_ext.set_package_variable( 'test_pkg_var', 'v_char', 'shared.airline.basecurrency'::CHARACTER

VARYING(100));

PERFORM aws_oracle_ext.set_package_variable('test_pkg_var', 'v_num', 123::integer);

END;

$BODY$

LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION test_pkg_var.function_1(pg_serialize int default 1)

RETURNS void
AS

$BODY$
DECLARE

BEGIN

PERFORM test_pkg_var.init(pg_serialize);

raise notice 'v_char%',aws_oracle_ext.get_package_variable( 'test_pkg_var', 'v_char');

raise notice 'v_num%',aws_oracle_ext.get_package_variable( 'test_pkg_var', 'v_num');

PERFORM aws_oracle_ext.set_package_variable( 'test_pkg_var', 'v_char', 'test1'::varchar);

PERFORM test_pkg_var.function_2(0);
END;

$BODY$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION test_pkg_var.function_2(IN pg_serialize integer default 1)

RETURNS void

AS

$BODY$

DECLARE

BEGIN

PERFORM test_pkg_var.init(pg_serialize);

raise notice 'v_char%',aws_oracle_ext.get_package_variable( 'test_pkg_var', 'v_char');

raise notice 'v_num%',aws_oracle_ext.get_package_variable( 'test_pkg_var', 'v_num');

END;
$BODY$
LANGUAGE plpgsql;


Calling the above functions

select test_pkg_var.function_1()

 select test_pkg_var.function_2()
```