

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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql"></a>

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

## Ringkasan
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-summary"></a>

[Pola ini menjelaskan cara meniru array PL/SQL asosiatif Oracle dengan posisi indeks kosong di Amazon [Aurora PostgreSQL dan Amazon RDS untuk lingkungan PostgreSQL](https://aws.amazon.com/rds/aurora/).](https://aws.amazon.com/rds/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 oleh`PLS_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)](https://docs.aws.amazon.com/SchemaConversionTool/) 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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-prereqs"></a>

**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**
+ Beberapa Layanan AWS tidak tersedia di semua Wilayah AWS. Untuk ketersediaan Wilayah, lihat [Layanan AWS berdasarkan Wilayah](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/). Untuk titik akhir tertentu, lihat halaman [titik akhir dan kuota Layanan](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html), dan pilih tautan untuk layanan.

**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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-architecture"></a>

**Tumpukan teknologi sumber**
+ Database Oracle lokal

**Tumpukan teknologi target**
+ Amazon Aurora PostgreSQL
+ Amazon RDS for PostgreSQL

**Arsitektur target**

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/a62d038c-ca3c-41e1-aa7e-74282d2e54f4/images/13aacf00-655a-4149-a4e7-42b66dbea4e1.png)


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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-tools"></a>

**Layanan AWS**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) adalah mesin database relasional yang dikelola sepenuhnya yang dibangun untuk cloud dan kompatibel dengan MySQL dan PostgreSQL.
+ [Amazon Aurora PostgreSQL Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) adalah mesin database relasional yang dikelola sepenuhnya dan sesuai dengan ACID yang membantu Anda mengatur, mengoperasikan, dan menskalakan penerapan PostgreSQL.
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) menyediakan kapasitas komputasi yang dapat diskalakan di. AWS Cloud Anda dapat meluncurkan server virtual sebanyak yang Anda butuhkan dan dengan cepat meningkatkannya ke atas atau ke bawah.
+ [Amazon Relational Database Service (Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)) membantu Anda menyiapkan, mengoperasikan, dan menskalakan database relasional di. AWS Cloud
+ [Amazon Relational Database Service (Amazon RDS) untuk](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) Oracle membantu Anda mengatur, mengoperasikan, dan menskalakan database relasional Oracle di file. AWS Cloud
+ [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
+ [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) mendukung migrasi database heterogen dengan secara otomatis mengonversi skema basis data sumber dan sebagian besar kode kustom ke format yang kompatibel dengan database target.

**Alat lainnya**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) adalah lingkungan pengembangan terintegrasi yang menyederhanakan pengembangan dan pengelolaan database Oracle baik dalam penerapan tradisional maupun berbasis cloud.
+ [pgAdmin](https://www.pgadmin.org/) 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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-best-practices"></a>
+ 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
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-epics"></a>

### Perilaku array asosiatif Oracle (sumber)
<a name="oracle-associative-array-behavior-source"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat PL/SQL blok sumber di Oracle. | Buat PL/SQL blok sumber di Oracle yang menggunakan array asosiatif berikut:<pre>DECLARE<br />    TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer;<br />    cc country_codes;<br />    cc_idx NUMBER := NULL;<br />BEGIN<br />    cc(7) := 'India';<br />    cc(3) := 'UK';<br />    cc(5) := 'USA';<br />    cc(0) := 'China';<br />    cc(-2) := 'Invalid';<br />    dbms_output.put_line('cc_length:' || cc.COUNT);<br />    IF (cc.COUNT > 0) THEN<br />        cc_idx := cc.FIRST;<br />        FOR i IN 1..cc.COUNT LOOP<br />            dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx));<br />            cc_idx := cc.next(cc_idx);<br />        END LOOP;<br />    END IF;<br />END;</pre> | 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:<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | DBA | 

### Perilaku array asosiatif PostgreSQL (target)
<a name="postgresql-associative-array-behavior-target"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat PL/pgSQL blok target di PostgreSQL. | Buat PL/pgSQL blok target di PostgreSQL yang menggunakan array asosiatif berikut:<pre>DO $$<br />DECLARE<br />    cc character varying(100)[];<br />    cc_idx integer := NULL;<br />BEGIN<br />    cc[7] := 'India';<br />    cc[3] := 'UK';<br />    cc[5] := 'USA';<br />    cc[0] := 'China';<br />    cc[-2] := 'Invalid';<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1)<br />        LOOP<br />            RAISE NOTICE 'cc_idx:% country:%', i, cc[i];<br />        END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | 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.<pre>cc_length:10<br />cc_idx:-2 country:Invalid<br />cc_idx:-1 country:<NULL><br />cc_idx:0 country:China<br />cc_idx:1 country:<NULL><br />cc_idx:2 country:<NULL><br />cc_idx:3 country:UK<br />cc_idx:4 country:<NULL><br />cc_idx:5 country:USA<br />cc_idx:6 country:<NULL><br />cc_idx:7 country:India</pre> | DBA | 

### Meniru perilaku array asosiatif Oracle
<a name="emulate-oracle-associative-array-behavior"></a>


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

## Sumber daya terkait
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-resources"></a>

**AWS dokumentasi**
+ [AWS blog basis data](https://aws.amazon.com/blogs/database/)
+ [Buku pedoman migrasi Oracle ke Aurora PostgreSQL](https://docs.aws.amazon.com/dms/latest/oracle-to-aurora-postgresql-migration-playbook/chap-oracle-aurora-pg.html)

**Dokumentasi lainnya**
+ [Array asosiatif Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/associative-arrays.html#GUID-8060F01F-B53B-48D4-9239-7EA8461C2170)
+ [Fungsi dan operator array PostgreSQL](https://www.postgresql.org/docs/current/functions-array.html)
+ [PostgreSQL tipe yang ditentukan pengguna](https://www.postgresql.org/docs/current/sql-createtype.html)