

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Oracle SERIALLY\$1REUSABLE 프라그마 패키지를 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>

이 패턴은 SERIALLY\$1REUSABLE 프라그마로 정의된 Oracle 패키지를 Amazon Web Services(AWS) 의 PostgreSQL로 마이그레이션하기 위한 단계별 접근 방식을 제공합니다. 이 접근 방식은 SERIALLY\$1REUSABLE 프라그마의 기능을 유지합니다.

PostgreSQL은 패키지 개념과 SERIALLY\$1REUSABLE 프라그마를 지원하지 않습니다. PostgreSQL에서 유사한 기능을 사용하려면 패키지용 스키마를 만들고 스키마 내에 모든 관련 객체(예: 함수, 프로시저, 형식) 를 배포하면 됩니다. SERIALLY\$1REUSABLE 프라그마의 기능을 구현하기 위해 이 패턴에서 제공되는 예제 래퍼 함수 스크립트는 [AWS Schema Conversion Tool(AWS SCT) 확장 팩](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_ExtensionPack.html)을 사용합니다.

자세한 내용은 Oracle 설명서의 [SERIALLY\$1REUSABLE 프라그마](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-Compatible Edition 데이터베이스 또는 Amazon Relational Database Service(Amazon RDS) for PostgreSQL 데이터베이스 

**제품 버전**
+ Oracle Database 버전 10g 이상

## 아키텍처
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-architecture"></a>

**소스 기술 스택**
+ Oracle Database 온프레미스

**대상 기술 스택**
+ [Aurora PostgreSQL-Compatible](https://aws.amazon.com/rds/aurora/details/postgresql-details/) 또는 Amazon RDS for PostgreSQL
+ AWS SCT

**마이그레이션 아키텍처**

![\[AWS SCT, .sql 파일, 수동 변환을 사용하여 AWS로 전송되는 온프레미스 Oracle DB 데이터를 PostgreSQL로 변환합니다.\]](http://docs.aws.amazon.com/ko_kr/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 Schema Conversion Tool(AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)은 소스 데이터베이스 스키마와 대부분의 사용자 지정 코드를 대상 데이터베이스와 호환되는 형식으로 자동 변환하여 이기종 데이터베이스 마이그레이션을 지원합니다.
+ [Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)은 PostgreSQL 배포를 설정, 운영 및 확장할 수 있는 완전 관리형 ACID 준수 관계형 데이터베이스 엔진입니다.
+ [Amazon Relational Database Service(Amazon RDS) for PostgreSQL](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>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS SCT를 설정합니다. | 소스 데이터베이스에 대한 AWS SCT 연결을 구성합니다. 자세한 내용은 [Oracle Database를 AWS SCT의 소스로 사용](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.html)을 참조하십시오. | DBA, 개발자 | 
| 스크립트 변환. | AWS SCT를 사용하면 대상 데이터베이스를 Aurora PostgreSQL-Compatible로 선택하여 Oracle 패키지를 변환할 수 있습니다. | DBA, 개발자 | 
| .sql 파일을 저장합니다. | .sql 파일을 저장하기 전에 AWS SCT의 **프로젝트 설정** 옵션을 **스테이지별 단일 파일**로 수정합니다. AWS SCT는 객체 유형에 따라 .sql 파일을 여러 .sql 파일로 분리합니다. | DBA, 개발자 | 
| 코드를 변경합니다. | AWS SCT에서 생성한 `init` 함수를 열고 *추가 정보* 섹션의 예제에 표시된 대로 변경합니다. `pg_serialize = 0` 함수를 구현하기 위한 변수가 추가됩니다. | DBA, 개발자 | 
| 변환을 테스트합니다. | Aurora PostgreSQL-Compatible 데이터베이스에 `init` 함수를 배포하고 결과를 테스트합니다. | 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 프라그마](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()
```