---
title: "PostgreSQL naar Oracle migreren in je browser"
description: "Migreer een PostgreSQL-database naar Oracle: zet een pg_dump-bestand om naar een script met dezelfde tabellen, sleutels en data, en een rapport van elke wijziging."
canonical: https://intosql.com/nl/postgresql-naar-oracle
last_updated: 2026-10-15
---

# PostgreSQL naar Oracle migreren in je browser

Zet een gewone dump van pg_dump of pg_dumpall neer, als .sql of .sql.gz, en download een Oracle-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die Oracle niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

[Migratiehandleiding PostgreSQL naar Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Datatypen van PostgreSQL naar Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Wat er verandert van PostgreSQL naar Oracle

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

| In PostgreSQL | In Oracle | Rapportregel |
| --- | --- | --- |
| boolean | NUMBER(1) met een CHECK op 0 en 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), in tekens geteld |  |
| text | VARCHAR2(4000 CHAR) als elke waarde in 4000 bytes past (750 tekens in een sleutel), anders CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | exacte vergelijking | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER als de waarden in 38 cijfers passen, anders VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) met de tekst van PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB met een JSON-array | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 of CLOB met de tekst van PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE in UTC |  |
| time | INTERVAL DAY TO SECOND vanaf middernacht |  |
| 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 weggelaten | `not_null_relaxed` |
| enum types | VARCHAR2 met een CHECK op de labels |  |
| enum columns holding values outside their labels | VARCHAR2 zonder check | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER met de waarde van de bits tot 63 bits; daarboven tekstcijfers |  |
| oid, xid, cid | NUMBER(10) met een CHECK dat het niet negatief is |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, verdergaand na het hoogste id |  |
| a second serial or identity column in a table | een geheel getal zonder teller | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, op de waarde die hij had bereikt |  |
| generated columns | virtuele kolommen | `stored_as_virtual` |
| generated columns with functions Oracle lacks | een gewone kolom met de waarden | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | geen standaardwaarde | `default_not_translated` |
| CHECK constraints | vertaald, inline in CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | niet aangemaakt | `check_skipped` |
| CHECK ... NOT VALID | niet aangemaakt | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | niet aangemaakt | `index_skipped` |
| foreign keys | na de data ENABLE NOVALIDATE, daarna gevalideerd met een waarschuwing bij wezen |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | weggelaten | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | niet aangemaakt | `foreign_key_skipped` |
| names over 128 bytes | ingekort | `name_shortened` |
| partitioned tables | één tabel met de rijen van elke partitie | `partitions_dropped` |
| schemas | één schema, tabellen met de naam van hun schema ervoor | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | vermeld in het rapport | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | typen afgeleid uit de waarden | `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 | de foute bytes als het vervangingsteken | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | ongewijzigd gekopieerd | `mojibake_suspected` |

## Het script in Oracle laden

Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.

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

Refererende sleutels worden toegevoegd met ENABLE NOVALIDATE, zodat nieuwe rijen meteen worden gecontroleerd, en daarna gevalideerd. Verwijst een oude rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongevalideerd, in plaats van halverwege te mislukken.

Voer bij een grote dump SQL*Plus uit op dezelfde machine als de database. Het script commit elke 100 rijen. De gebruiker die het uitvoert, heeft CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER en CREATE PROCEDURE nodig, en quota op zijn tablespace.

## Een dump van PostgreSQL maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

- --format=plain, de standaard van pg_dump, schrijft SQL. Een custom- of directoryarchief (-Fc, -Fd) wordt SQL met pg_restore -f dump.sql, zonder databaseserver.
- --no-owner --no-privileges laten rollen en rechten weg, die de converter toch overslaat, dus de dump wordt kleiner.
- pg_dumpall zet elke database in één bestand; de tabellen van elke database krijgen de naam ervan, dus niets botst.

## Wat niet wordt geconverteerd

Weergaven, gematerialiseerde weergaven, functies, procedures, triggers, regels, beveiligingsbeleid voor rijen, extensies en typen zijn geschreven in de eigen taal van PostgreSQL. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor Oracle.

## Vragen over PostgreSQL naar Oracle

### Wordt mijn dump geüpload?

Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.

### Hoe groot mag de dump zijn?

De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.

### Leest het pg_dump -Fc-archieven?

Niet direct: een custom-archief is een binair formaat. pg_restore -f dump.sql dump.backup zet het om naar de gewone SQL die de converter leest, zonder verbinding met een server. De converter meldt dat als hij een archief krijgt.

### Van welke PostgreSQL-versies kan de dump komen?

Dumps geschreven door pg_dump en pg_dumpall vanaf PostgreSQL 10, met rijen als COPY of INSERT. Elke testdump komt van PostgreSQL 13 en 18 en wordt cel voor cel met zijn bron vergeleken.

### Blijven serial- en identity-waarden behouden?

Ja. De serial- of identity-kolom van elke tabel wordt een identity-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste. Sequences die niet bij een kolom horen, worden Oracle-sequences op de waarde die ze hadden bereikt.

### Wat gebeurt er met arrays, enums en andere PostgreSQL-typen?

Arrays worden JSON-arrays, booleans NUMBER(1), timestamps met tijdzone TIMESTAMP WITH TIME ZONE, en tekst VARCHAR2 als de waarden passen, anders CLOB. Lege strings worden NULL, zoals Oracle ze opslaat, en het rapport telt ze.

### En functies, triggers en weergaven?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.

### Op welke Oracle-versies laadt het script?

Oracle 19c en later. Elke testdump laadt op 21c en 23ai en stopt bij de eerste fout als er iets misgaat.

## Vanuit PostgreSQL

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

## Naar Oracle

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

## Handleiding en elke combinatie

- [Oracle naar PostgreSQL](https://intosql.com/nl/oracle-naar-postgresql)
- [Migratiehandleiding PostgreSQL naar Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Datatypen van PostgreSQL naar Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Elke databasecombinatie](https://intosql.com/nl/databasemigratie)
