

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Oracle SERIALLY\$1REUSABLE pragma 套件遷移至 PostgreSQL
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi，Amazon Web Services*

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

此模式提供step-by-step方法，將定義為 SERIALLY\$1REUSABLE pragma 的 Oracle 套件遷移至 Amazon Web Services (AWS) 上的 PostgreSQL。此方法會維護 SERIALLY\$1REUSABLE pragma 的功能。

PostgreSQL 不支援套件和 SERIALLY\$1REUSABLE pragma 的概念。若要在 PostgreSQL 中取得類似的功能，您可以為套件建立結構描述，並在結構描述內部署所有相關物件 （例如函數、程序和類型）。為了實現 SERIALLY\$1REUSABLE pragma 的功能，此模式中提供的範例包裝函式指令碼使用 [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>

**先決條件**
+ 作用中的 AWS 帳戶
+ 最新版本的 AWS SCT 和必要的驅動程式
+ Amazon Aurora PostgreSQL 相容版本資料庫或 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 資料庫 

**產品版本**
+ Oracle 資料庫 10g 版及更新版本

## Architecture
<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

**遷移架構**

![\[使用 AWS SCT、.sql 檔案、手動轉換至 PostgreSQL 傳送至 AWS 的內部部署 Oracle 資料庫資料。\]](http://docs.aws.amazon.com/zh_tw/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>

**AWS 服務**
+ [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 部署。
+ [適用於 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可協助您在 AWS 雲端中設定、操作和擴展 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 AWS SCT。 | 設定來源資料庫的 AWS SCT 連線。如需詳細資訊，請參閱[使用 Oracle 資料庫做為 AWS SCT 的來源](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.html)。 | DBA、開發人員 | 
| 轉換指令碼。 | 使用 AWS SCT 將目標資料庫選取為 Aurora PostgreSQL 相容，以轉換 Oracle 套件。 | DBA、開發人員 | 
| 儲存 .sql 檔案。 | 儲存 .sql 檔案之前，請將 AWS SCT 中的**專案設定**選項修改為**每個階段的單一檔案**。AWS SCT 會根據物件類型，將 .sql 檔案分成多個 .sql 檔案。 | DBA、開發人員 | 
| 變更程式碼。 | 開啟 AWS SCT 產生的`init`函數，並如*其他資訊*區段中的範例所示進行變更。它會新增變數來實現功能 `pg_serialize = 0`。 | DBA、開發人員 | 
| 測試轉換。 | 將`init`函數部署至 Aurora PostgreSQL 相容資料庫，並測試結果。 | DBA、開發人員 | 

## 相關資源
<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()
```