---
title: "Migrasi PostgreSQL ke Oracle di browser Anda"
description: "Migrasi database PostgreSQL ke Oracle: konversi file pg_dump menjadi skrip dengan tabel, kunci, dan data yang sama, plus laporan setiap perubahan."
canonical: https://intosql.com/id/postgresql-ke-oracle
last_updated: 2026-10-15
---

# Migrasi PostgreSQL ke Oracle di browser Anda

Letakkan dump plain dari pg_dump atau pg_dumpall, sebagai .sql atau .sql.gz, lalu unduh skrip Oracle dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan Oracle apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.

[Panduan migrasi PostgreSQL ke Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Tipe data PostgreSQL ke Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Yang berubah dari PostgreSQL ke Oracle

Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.

| Di PostgreSQL | Di Oracle | Baris laporan |
| --- | --- | --- |
| boolean | NUMBER(1) dengan CHECK 0 dan 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), menghitung karakter |  |
| text | VARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte (750 karakter dalam key), selain itu CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | perbandingan persis | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER jika nilainya muat dalam 38 digit, selain itu VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) berisi teks PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB berisi array JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 atau CLOB berisi teks PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE dalam UTC |  |
| time | INTERVAL DAY TO SECOND sejak tengah malam |  |
| infinity, -infinity, BC dates and years past 9999 | NULL | `date_out_of_range` |
| NaN and Infinity in numeric | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL dihapus | `not_null_relaxed` |
| enum types | VARCHAR2 dengan CHECK labelnya |  |
| enum columns holding values outside their labels | VARCHAR2 tanpa CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER dengan nilai bit hingga 63 bit; digit teks jika lebih |  |
| oid, xid, cid | NUMBER(10) dengan CHECK bahwa nilainya tidak negatif |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggi |  |
| a second serial or identity column in a table | bilangan bulat biasa | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, pada nilai yang sudah dicapainya |  |
| generated columns | kolom virtual | `stored_as_virtual` |
| generated columns with functions Oracle lacks | kolom biasa berisi nilainya | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | tanpa default | `default_not_translated` |
| CHECK constraints | diterjemahkan, langsung di CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | tidak dibuat | `check_skipped` |
| CHECK ... NOT VALID | tidak dibuat | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | tidak dibuat | `index_skipped` |
| foreign keys | setelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris tanpa induk |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | dihapus | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | tidak dibuat | `foreign_key_skipped` |
| names over 128 bytes | dipersingkat | `name_shortened` |
| partitioned tables | satu tabel dengan baris dari setiap partisi | `partitions_dropped` |
| schemas | satu skema, nama tabel diawali nama skemanya | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | dicantumkan di laporan | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipe dibaca dari nilainya | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| text that isn't valid in its encoding | byte yang rusak menjadi karakter pengganti | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | disalin apa adanya | `mojibake_suspected` |

## Muat skrip ke Oracle

Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @postgresql.oracle.sql
```

Foreign key ditambahkan ENABLE NOVALIDATE, jadi baris baru langsung diperiksa, lalu divalidasi. Jika baris lama merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak tervalidasi, bukan gagal di tengah jalan.

Untuk dump yang besar, jalankan SQL*Plus di mesin yang sama dengan database. Skrip melakukan commit setiap 100 baris. Pengguna yang menjalankannya memerlukan CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, dan CREATE PROCEDURE, serta kuota di tablespace-nya.

## Buat dump PostgreSQL untuk hasil terbaik

Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:

- --format=plain, default pg_dump, menulis SQL. Arsip custom atau directory (-Fc, -Fd) menjadi SQL dengan pg_restore -f dump.sql, tanpa server database.
- --no-owner --no-privileges menghilangkan role dan grant, yang memang dilewati konverter, jadi dump lebih kecil.
- pg_dumpall menyimpan setiap database dalam satu file; tabel masing-masing diberi nama sesuai database-nya, jadi tidak ada yang bentrok.

## Yang tidak dikonversi

View, materialized view, fungsi, prosedur, trigger, rule, kebijakan keamanan baris, ekstensi, dan tipe ditulis dalam bahasa PostgreSQL sendiri. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk Oracle.

## Pertanyaan tentang PostgreSQL ke Oracle

### Apakah dump saya diunggah?

Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.

### Seberapa besar dump yang bisa dipakai?

Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.

### Apakah arsip pg_dump -Fc bisa dibaca?

Tidak langsung: arsip custom adalah format biner. pg_restore -f dump.sql dump.backup mengubahnya menjadi SQL plain yang dibaca konverter, tanpa terhubung ke server. Konverter memberi tahu saat menerima arsip.

### Dump dari versi PostgreSQL mana yang bisa dipakai?

Dump yang ditulis pg_dump dan pg_dumpall dari PostgreSQL 10 ke atas, dengan baris COPY atau INSERT. Setiap dump uji berasal dari PostgreSQL 13 dan 18 dan dibandingkan dengan sumbernya sel demi sel.

### Apakah nilai serial dan identity dipertahankan?

Ya. Kolom serial atau identity setiap tabel menjadi kolom identity, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi. Sequence yang tidak dimiliki kolom menjadi sequence Oracle pada nilai yang sudah dicapainya.

### Apa yang terjadi pada array, enum, dan tipe PostgreSQL lainnya?

Array menjadi array JSON, boolean menjadi NUMBER(1), timestamp dengan zona waktu menjadi TIMESTAMP WITH TIME ZONE, dan teks menjadi VARCHAR2 jika nilainya muat, selain itu CLOB. String kosong menjadi NULL, seperti yang disimpan Oracle, dan laporan menghitungnya.

### Bagaimana dengan fungsi, trigger, dan view?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.

### Di versi Oracle mana skrip bisa dimuat?

Oracle 19c dan yang lebih baru. Setiap dump uji dimuat di 21c dan 23ai, dan berhenti di galat pertama jika ada yang salah.

## Dari PostgreSQL

- [PostgreSQL ke PostgreSQL](https://intosql.com/id/postgresql-ke-postgresql)
- [PostgreSQL ke MySQL](https://intosql.com/id/postgresql-ke-mysql)
- [PostgreSQL ke MariaDB](https://intosql.com/id/postgresql-ke-mariadb)
- [PostgreSQL ke SQLite](https://intosql.com/id/postgresql-ke-sqlite)
- [PostgreSQL ke SQL Server](https://intosql.com/id/postgresql-ke-sql-server)

## Ke Oracle

- [MySQL ke Oracle](https://intosql.com/id/mysql-ke-oracle)
- [MariaDB ke Oracle](https://intosql.com/id/mariadb-ke-oracle)
- [SQL Server ke Oracle](https://intosql.com/id/sql-server-ke-oracle)
- [SQLite ke Oracle](https://intosql.com/id/sqlite-ke-oracle)
- [Oracle ke Oracle](https://intosql.com/id/oracle-ke-oracle)

## Panduan dan setiap pasangan

- [Oracle ke PostgreSQL](https://intosql.com/id/oracle-ke-postgresql)
- [Panduan migrasi PostgreSQL ke Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Tipe data PostgreSQL ke Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Setiap pasangan database](https://intosql.com/id/migrasi-database)
