

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Migrasikan paket Oracle SERIALLY\_REUSABLE Pragma ke Amazon Aurora atau Amazon RDS for PostgreSQL
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi, Amazon Web Services*

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

Pola ini menyediakan pendekatan langkah demi langkah untuk memigrasikan paket Oracle yang menggunakan Serially\_REUSABLE Pragma ke Amazon Aurora PostgreSQL-Compatible Edition atau Amazon RDS for PostgreSQL aktif, sambil mempertahankan fungsionalitas aslinya. AWS

PRAGMA SERIALLY\_REUSABLE menunjukkan bahwa status paket diperlukan hanya untuk durasi satu panggilan ke server (misalnya, blok PL/SQL anonim atau panggilan prosedur tersimpan melalui tautan database). Setelah panggilan ini, penyimpanan untuk variabel paket dapat digunakan kembali, mengurangi konsumsi memori.

PostgreSQL tidak secara native mendukung konsep SERIALLY\_REUSABLE Pragma. Untuk mencapai fungsionalitas yang setara, pola ini menggunakan pendekatan fungsi pembungkus yang dikombinasikan dengan fitur AWS Database Migration Service (AWS DMS) [Schema Conversion (AWS DMS SC)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) untuk memigrasikan struktur paket. Contoh skrip yang disediakan menunjukkan cara mempertahankan perilaku reset-on-each-call di PostgreSQL.

Untuk informasi selengkapnya, lihat [SERIALLY\_REUSABLE](https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/SERIALLY_REUSABLE-pragma.html) Pragma dalam dokumentasi Oracle.

## Prasyarat dan batasan
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>
+ Aktif Akun AWS
+ Akses ke layanan Konversi AWS DMS Skema
+ Database Amazon Aurora PostgreSQL-Compatible Edition atau Amazon RDS untuk database PostgreSQL
+ Database Oracle versi 10g atau yang lebih baru

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

**Tumpukan teknologi sumber**
+ On-premises Basis data Oracle

**Tumpukan teknologi target**
+ [Aurora PostgreSQL-Compatible](https://aws.amazon.com/rds/aurora/details/postgresql-details/) atau Amazon RDS untuk PostgreSQL
+ AWS DMS Konversi Skema

**Arsitektur migrasi**

![Migrasikan paket Oracle SERIALLY_REUSABLE Pragma ke Amazon Aurora atau Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/955ed078-0941-4ae6-b56e-964379a29365.jpeg)


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

**Layanan AWS**
+ [AWS Database Migration Service (AWS DMS) Konversi Skema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) membuat migrasi database antara berbagai jenis database lebih dapat diprediksi. Gunakan untuk menilai kompleksitas migrasi Anda untuk penyedia data sumber Anda dan untuk mengonversi skema database dan objek kode. Anda kemudian dapat menerapkan kode yang dikonversi ke database target Anda.
+ [Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) adalah mesin database ACID-compliant relasional yang dikelola sepenuhnya yang membantu Anda mengatur, mengoperasikan, dan menskalakan penerapan PostgreSQL.
+ [Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) membantu Anda mengatur, mengoperasikan, dan menskalakan database relasional PostgreSQL di file. AWS Cloud

**Alat-alat lainnya**
+ [pgAdmin](https://www.pgadmin.org/) adalah alat manajemen sumber terbuka untuk PostgreSQL. Ini menyediakan antarmuka grafis yang membantu Anda membuat, memelihara, dan menggunakan objek database.

## Praktik terbaik
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-best-practices"></a>
+ Selalu gunakan `reset_vars = 1` untuk panggilan tingkat atas dan `reset_vars = 0` untuk sub-panggilan internal.
+ Simpan semua nilai default dalam `$init` fungsi sebagai sumber kebenaran tunggal.
+ Cocokkan nama variabel Oracle di PostgreSQL untuk ketertelusuran.
+ Validasi dengan membandingkan Oracle dengan output `DBMS_OUTPUT` PostgreSQL. `RAISE NOTICE`
+ Uji dalam sesi PostgreSQL terpisah untuk mengonfirmasi variabel yang disetel ulang antar panggilan.

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

### Migrasi paket Oracle dengan menggunakan AWS DMS SC
<a name="migrate-the-oracle-package-by-using-dms-sc"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Mengatur AWS DMS SC. | Konfigurasikan AWS DMS konektivitas ke database sumber. Untuk informasi selengkapnya, lihat [Mengonversi skema database menggunakan Konversi Skema DMS](https://docs.aws.amazon.com/dms/latest/userguide/getting-started.html). | DBA, Pengembang | 
| Konversi skrip. | Gunakan AWS DMS SC untuk mengonversi paket Oracle dengan memilih database target sebagai Aurora PostgreSQL-Compatible. | DBA, Pengembang | 
| Simpan file.sql. | Sebelum Anda menyimpan file.sql, ubah opsi **Pengaturan Proyek** di AWS DMS SC ke **File tunggal per tahap**. Ini mengkonfigurasi AWS DMS untuk memisahkan file.sql menjadi beberapa file.sql berdasarkan jenis objek. | DBA, Pengembang | 
| Ubah kodenya. | Buka `init` fungsi yang dihasilkan oleh AWS DMS SC, dan ubah seperti yang ditunjukkan pada contoh di bagian *Informasi tambahan*. Ini akan menambahkan variabel untuk mencapai fungsionalitas`reset_vars = 0`. | DBA, Pengembang | 
| Uji konversi. | Menyebarkan `init` fungsi ke database PostgreSQL-Compatible Aurora, dan menguji hasilnya. | DBA, Pengembang | 

## Pemecahan masalah
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-troubleshooting"></a>


| Isu | Solusi | 
| --- | --- | 
| Field tidak ada kesalahan saat mengakses variabel paket. | Pastikan bahwa kondisi `$init` fungsi menggunakan `IF v_need_init` atau `reset_vars = 1` lebih bahwa variabel selalu dibuat pada akses pertama dalam sesi. | 
| Variabel tidak mengatur ulang antara panggilan tingkat atas atau mengatur ulang secara tidak terduga selama sub-panggilan internal. | Gunakan `reset_vars = 1` untuk panggilan tingkat atas langsung dan lulus `reset_vars = 0` untuk panggilan fungsi-ke-fungsi internal. | 

## Sumber daya terkait
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS DMS Konversi Skema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Fitur Amazon Aurora](https://aws.amazon.com/rds/aurora/postgresql-features/)
+ [SERIALLY\_REUSABLE Pragma](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/seriallyreusable_pragma.htm#LNPLS01346)

## Informasi tambahan
<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) := 'DEFAULT_VALUE';
  v_num NUMBER := 123;
  PROCEDURE function_2(test_id NUMBER) IS
  BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END;
  PROCEDURE function_1(test_id NUMBER) IS
  BEGIN
    dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num);
    v_char := 'MODIFIED_VALUE';
    dbms_output.put_line('function_1 => v_char after update=' || v_char);
    function_2(0);
  END;
END test_pkg_var;
/
SET SERVEROUTPUT ON
EXEC test_pkg_var.function_1(1);
EXEC test_pkg_var.function_2(1);
------Target PostgreSQL Code:
CREATE SCHEMA IF NOT EXISTS testoracle;
CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$
DECLARE v_need_init BOOLEAN;
BEGIN
  v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var');
  IF v_need_init OR reset_vars = 1 THEN
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20));
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123);
  END IF;
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN
  PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
  PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20));
  RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20));
  CALL testoracle.test_pkg_var$function_2(0);
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
END; $BODY$ LANGUAGE plpgsql;
CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE'
CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'
```