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
Vinay Paladi, Amazon Web Services
Ringkasan
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) untuk memigrasikan struktur paket. Contoh skrip yang disediakan menunjukkan cara mempertahankan perilaku reset-on-each-call di PostgreSQL.
Untuk informasi selengkapnya, lihat SERIALLY_REUSABLE
Prasyarat dan batasan
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
Tumpukan teknologi sumber
On-premises Basis data Oracle
Tumpukan teknologi target
Aurora PostgreSQL-Compatible
atau Amazon RDS untuk PostgreSQL AWS DMS Konversi Skema
Arsitektur migrasi

Alat
Layanan AWS
AWS Database Migration Service (AWS DMS) Konversi Skema 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 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 membantu Anda mengatur, mengoperasikan, dan menskalakan database relasional PostgreSQL di file. AWS Cloud
Alat-alat lainnya
pgAdmin
adalah alat manajemen sumber terbuka untuk PostgreSQL. Ini menyediakan antarmuka grafis yang membantu Anda membuat, memelihara, dan menggunakan objek database.
Praktik terbaik
Selalu gunakan
reset_vars = 1untuk panggilan tingkat atas danreset_vars = 0untuk sub-panggilan internal.Simpan semua nilai default dalam
$initfungsi sebagai sumber kebenaran tunggal.Cocokkan nama variabel Oracle di PostgreSQL untuk ketertelusuran.
Validasi dengan membandingkan Oracle dengan output
DBMS_OUTPUTPostgreSQL.RAISE NOTICEUji dalam sesi PostgreSQL terpisah untuk mengonfirmasi variabel yang disetel ulang antar panggilan.
Epik
| 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. | 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 | DBA, Pengembang |
Uji konversi. | Menyebarkan | DBA, Pengembang |
Pemecahan masalah
| Isu | Solusi |
|---|---|
Field tidak ada kesalahan saat mengakses variabel paket. | Pastikan bahwa kondisi |
Variabel tidak mengatur ulang antara panggilan tingkat atas atau mengatur ulang secara tidak terduga selama sub-panggilan internal. | Gunakan |
Sumber daya terkait
Informasi tambahan
-------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'