Meniru array PL/SQL asosiatif Oracle di Amazon Aurora PostgreSQL dan Amazon RDS untuk PostgreSQL - AWS Prescriptive Guidance

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

Meniru array PL/SQL asosiatif Oracle di Amazon Aurora PostgreSQL dan Amazon RDS untuk PostgreSQL

Rajkumar Raghuwanshi, Bhanu Ganesh Gudivada, dan Sachin Khanna, Amazon Web Services

Ringkasan

Pola ini menjelaskan cara meniru array PL/SQL asosiatif Oracle dengan posisi indeks kosong di Amazon Aurora PostgreSQL dan Amazon RDS untuk lingkungan PostgreSQL. Ini juga menjelaskan beberapa perbedaan antara array PL/SQL asosiatif Oracle dan array PostgreSQL sehubungan dengan bagaimana masing-masing menangani posisi indeks kosong selama migrasi.

Kami menyediakan alternatif PostgreSQL untuk aws_oracle_ext menggunakan fungsi untuk menangani posisi indeks kosong saat memigrasi database Oracle. Pola ini menggunakan kolom tambahan untuk menyimpan posisi indeks, dan mempertahankan penanganan Oracle terhadap array jarang sambil menggabungkan kemampuan PostgreSQL asli.

Oracle

Di Oracle, koleksi dapat diinisialisasi sebagai kosong dan diisi menggunakan metode EXTEND pengumpulan, yang menambahkan NULL elemen ke array. Saat bekerja dengan array PL/SQL asosiatif yang diindeks olehPLS_INTEGER, EXTEND metode ini menambahkan NULL elemen secara berurutan, tetapi elemen juga dapat diinisialisasi pada posisi indeks nonsequential. Posisi indeks apa pun yang tidak diinisialisasi secara eksplisit tetap kosong.

Fleksibilitas ini memungkinkan struktur array jarang di mana elemen dapat diisi pada posisi arbitrer. Saat melakukan iterasi melalui koleksi menggunakan FOR LOOP with FIRST dan LAST bounds, hanya elemen yang diinisialisasi (baik NULL atau dengan nilai yang ditentukan) yang diproses, sementara posisi kosong dilewati.

PostgreSQL (Amazon Aurora dan Amazon RDS)

PostgreSQL menangani nilai kosong secara berbeda dari nilai. NULL Ini menyimpan nilai kosong sebagai entitas berbeda yang menggunakan satu byte penyimpanan. Ketika sebuah array memiliki nilai kosong, PostgreSQL menetapkan posisi indeks sekuensial seperti nilai non-kosong. Tetapi pengindeksan sekuensial membutuhkan pemrosesan tambahan karena sistem harus mengulangi semua posisi yang diindeks, termasuk yang kosong. Ini membuat pembuatan array tradisional tidak efisien untuk kumpulan data yang jarang.

AWS Schema Conversion Tool

The AWS Schema Conversion Tool (AWS SCT) biasanya menangani Oracle-to-PostgreSQL migrasi menggunakan aws_oracle_ext fungsi. Dalam pola ini, kami mengusulkan pendekatan alternatif yang menggunakan kemampuan PostgreSQL asli, yang menggabungkan tipe array PostgreSQL dengan kolom tambahan untuk menyimpan posisi indeks. Sistem kemudian dapat mengulangi melalui array hanya menggunakan kolom indeks.

Prasyarat dan batasan

Prasyarat

  • Aktif Akun AWS.

  • Pengguna AWS Identity and Access Management (IAM) dengan izin administrator.

  • Instance yang kompatibel dengan Amazon RDS atau Aurora PostgreSQL.

  • Pemahaman dasar tentang database relasional.

Batasan

Versi produk

Pola ini diuji dengan versi berikut:

  • Amazon Aurora PostgreSQL 13.3

  • Amazon RDS untuk PostgreSQL 13.3

  • AWS SCT 1.0.674

  • Oracle 12c EE 12.2

Arsitektur

Tumpukan teknologi sumber

  • Database Oracle lokal

Tumpukan teknologi target

  • Amazon Aurora PostgreSQL

  • Amazon RDS for PostgreSQL

Arsitektur target

Diagram menunjukkan yang berikut:

  • Sumber Amazon RDS for Oracle database instance

  • EC2 Instans Amazon dengan AWS SCT untuk mengonversi fungsi Oracle ke PostgreSQL yang setara

  • Database target yang kompatibel dengan Amazon Aurora PostgreSQL

Alat

Layanan AWS

Alat lainnya

  • Oracle SQL Developer adalah lingkungan pengembangan terintegrasi yang menyederhanakan pengembangan dan pengelolaan database Oracle baik dalam penerapan tradisional maupun berbasis cloud.

  • pgAdmin adalah alat manajemen open source untuk PostgreSQL. Ini menyediakan antarmuka grafis yang membantu Anda membuat, memelihara, dan menggunakan objek database. Dalam pola ini, pgAdmin terhubung ke RDS untuk instance database PostgreSQL dan menanyakan data. Atau, Anda dapat menggunakan klien baris perintah psql.

Praktik terbaik

  • Uji batas set data dan skenario tepi.

  • Pertimbangkan untuk menerapkan penanganan kesalahan untuk kondisi out-of-bounds indeks.

  • Optimalkan kueri untuk menghindari pemindaian kumpulan data yang jarang.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat PL/SQL blok sumber di Oracle.

Buat PL/SQL blok sumber di Oracle yang menggunakan array asosiatif berikut:

DECLARE TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer; cc country_codes; cc_idx NUMBER := NULL; BEGIN cc(7) := 'India'; cc(3) := 'UK'; cc(5) := 'USA'; cc(0) := 'China'; cc(-2) := 'Invalid'; dbms_output.put_line('cc_length:' || cc.COUNT); IF (cc.COUNT > 0) THEN cc_idx := cc.FIRST; FOR i IN 1..cc.COUNT LOOP dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx)); cc_idx := cc.next(cc_idx); END LOOP; END IF; END;
DBA

Jalankan PL/SQL blok.

Jalankan PL/SQL blok sumber di Oracle. Jika ada kesenjangan antara nilai indeks dari array asosiatif, tidak ada data yang disimpan dalam celah tersebut. Hal ini memungkinkan loop Oracle untuk iterasi hanya melalui posisi indeks.

DBA

Tinjau output.

Lima elemen dimasukkan ke dalam array (cc) pada interval yang tidak berurutan. Jumlah array ditunjukkan pada output berikut:

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA
TugasDeskripsiKeterampilan yang dibutuhkan

Buat PL/pgSQL blok target di PostgreSQL.

Buat PL/pgSQL blok target di PostgreSQL yang menggunakan array asosiatif berikut:

DO $$ DECLARE cc character varying(100)[]; cc_idx integer := NULL; BEGIN cc[7] := 'India'; cc[3] := 'UK'; cc[5] := 'USA'; cc[0] := 'China'; cc[-2] := 'Invalid'; RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1) LOOP RAISE NOTICE 'cc_idx:% country:%', i, cc[i]; END LOOP; END IF; END; $$;
DBA

Jalankan PL/pgSQL blok.

Jalankan PL/pgSQL blok target di PostgreSQL. Jika ada kesenjangan antara nilai indeks dari array asosiatif, tidak ada data yang disimpan dalam celah tersebut. Hal ini memungkinkan loop Oracle untuk iterasi hanya melalui posisi indeks.

DBA

Tinjau output.

Panjang array lebih besar dari 5 karena NULL disimpan dalam celah antara posisi indeks. Seperti yang ditunjukkan pada output berikut, loop menyelesaikan 10 iterasi untuk mengambil 5 nilai dalam array.

cc_length:10 cc_idx:-2 country:Invalid cc_idx:-1 country:<NULL> cc_idx:0 country:China cc_idx:1 country:<NULL> cc_idx:2 country:<NULL> cc_idx:3 country:UK cc_idx:4 country:<NULL> cc_idx:5 country:USA cc_idx:6 country:<NULL> cc_idx:7 country:India
DBA
TugasDeskripsiKeterampilan yang dibutuhkan

Buat PL/pgSQL blok target dengan array dan tipe yang ditentukan pengguna.

Untuk mengoptimalkan kinerja dan mencocokkan fungsionalitas Oracle, kita dapat membuat tipe yang ditentukan pengguna yang menyimpan posisi indeks dan data yang sesuai. Pendekatan ini mengurangi iterasi yang tidak perlu dengan mempertahankan asosiasi langsung antara indeks dan nilai.

DO $$ DECLARE cc country_codes[]; cc_append country_codes := NULL; i record; BEGIN cc_append.idx = 7; cc_append.val = 'India'; cc := array_append(cc, cc_append); cc_append.idx = 3; cc_append.val = 'UK'; cc := array_append(cc, cc_append); cc_append.idx = 5; cc_append.val = 'USA'; cc := array_append(cc, cc_append); cc_append.idx = 0; cc_append.val = 'China'; cc := array_append(cc, cc_append); cc_append.idx = - 2; cc_append.val = 'Invalid'; cc := array_append(cc, cc_append); RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ( SELECT * FROM unnest(cc) ORDER BY idx) LOOP RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val; END LOOP; END IF; END; $$;
DBA

Jalankan PL/pgSQL blok.

Jalankan PL/pgSQL blok target. Jika ada kesenjangan antara nilai indeks dari array asosiatif, tidak ada data yang disimpan dalam celah tersebut. Hal ini memungkinkan loop Oracle untuk iterasi hanya melalui posisi indeks.

DBA

Tinjau output.

Seperti yang ditunjukkan pada output berikut, tipe yang ditentukan pengguna hanya menyimpan elemen data yang terisi, yang berarti bahwa panjang array cocok dengan jumlah nilai. Akibatnya, LOOP iterasi dioptimalkan untuk memproses hanya data yang ada, menghilangkan kebutuhan untuk melacak posisi kosong.

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA

Sumber daya terkait

AWS dokumentasi

Dokumentasi lainnya