---
title: "Migrer une base PostgreSQL vers Oracle"
description: "Migrez une base PostgreSQL vers Oracle : convertissez un fichier pg_dump en script avec les mêmes tables, clés et données, et un rapport de chaque changement."
canonical: https://intosql.com/fr/postgresql-en-oracle
last_updated: 2026-10-15
---

# Migrer une base PostgreSQL vers Oracle

Déposez un dump texte de pg_dump ou pg_dumpall, en .sql ou .sql.gz, et téléchargez un script Oracle avec les mêmes tables, clés, index et données. Chaque valeur que Oracle ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

[Guide de migration de PostgreSQL vers Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Types de données de PostgreSQL vers Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Ce qui change de PostgreSQL à Oracle

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

| Dans PostgreSQL | Dans Oracle | Ligne du rapport |
| --- | --- | --- |
| boolean | NUMBER(1) avec un CHECK de 0 et 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), en caractères |  |
| text | VARCHAR2(4000 CHAR) si chaque valeur tient en 4000 octets (750 caractères dans une clé), sinon CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | comparaison exacte | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER si ses valeurs tiennent en 38 chiffres, sinon VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) avec le texte de PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB avec un tableau JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 ou CLOB avec le texte de PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE en UTC |  |
| time | INTERVAL DAY TO SECOND depuis minuit |  |
| 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 retiré | `not_null_relaxed` |
| enum types | VARCHAR2 avec un CHECK de ses libellés |  |
| enum columns holding values outside their labels | VARCHAR2 sans CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER avec la valeur des bits jusqu'à 63 bits ; chiffres en texte au-delà |  |
| oid, xid, cid | NUMBER(10) avec un CHECK qui interdit les négatifs |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, qui reprend après l'identifiant le plus élevé |  |
| a second serial or identity column in a table | un entier simple | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, à la valeur atteinte |  |
| generated columns | colonnes virtuelles | `stored_as_virtual` |
| generated columns with functions Oracle lacks | une colonne simple avec les valeurs | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites, en ligne dans CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | non créée | `check_skipped` |
| CHECK ... NOT VALID | non créée | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | non créé | `index_skipped` |
| foreign keys | après les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelins |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | supprimé | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | non créée | `foreign_key_skipped` |
| names over 128 bytes | raccourci | `name_shortened` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| schemas | un seul schéma, tables préfixées par le nom de leur schéma | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listés dans le rapport | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | types déduits des valeurs | `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 | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `mojibake_suspected` |

## Charger le script dans Oracle

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

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

Les clés étrangères sont ajoutées ENABLE NOVALIDATE, donc les nouvelles lignes sont vérifiées tout de suite, puis validées. Si une ancienne ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non validée, au lieu d'échouer à mi-chemin.

Pour un gros dump, exécutez SQL*Plus sur la machine de la base de données. Le script valide toutes les 100 lignes. L'utilisateur qui l'exécute a besoin de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER et CREATE PROCEDURE, et d'un quota sur son tablespace.

## Faire le dump PostgreSQL pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

- --format=plain, le format par défaut de pg_dump, écrit du SQL. Une archive custom ou directory (-Fc, -Fd) devient du SQL avec pg_restore -f dump.sql, sans serveur de base de données.
- --no-owner --no-privileges omettent les rôles et les droits, que le convertisseur ignore de toute façon ; le dump est donc plus petit.
- pg_dumpall met toutes les bases de données dans un seul fichier ; les tables de chacune sont préfixées par son nom, donc rien n'entre en collision.

## Ce qui n'est pas converti

Les vues, vues matérialisées, fonctions, procédures, déclencheurs, règles, politiques de sécurité des lignes, extensions et types sont écrits dans le langage propre à PostgreSQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour Oracle.

## Questions sur PostgreSQL vers Oracle

### Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

### Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

### Lit-il les archives pg_dump -Fc ?

Pas directement : une archive custom est un format binaire. pg_restore -f dump.sql dump.backup la transforme en SQL texte que le convertisseur lit, sans se connecter à un serveur. Le convertisseur le signale quand il reçoit une archive.

### De quelles versions de PostgreSQL le dump peut-il venir ?

Les dumps écrits par pg_dump et pg_dumpall depuis PostgreSQL 10, avec des lignes COPY ou INSERT. Chaque dump de test vient de PostgreSQL 13 et 18 et est comparé à sa source cellule par cellule.

### Les valeurs serial et identity sont-elles conservées ?

Oui. La colonne serial ou identity de chaque table devient une colonne d'identité, chaque ligne garde son identifiant, et le prochain identifiant reprend après le plus élevé. Les séquences qui n'appartiennent à aucune colonne deviennent des séquences Oracle à la valeur atteinte.

### Que deviennent les tableaux, les enums et les autres types PostgreSQL ?

Les tableaux deviennent des tableaux JSON, les booléens NUMBER(1), les timestamps avec fuseau horaire TIMESTAMP WITH TIME ZONE, et le texte VARCHAR2 si ses valeurs y tiennent, sinon CLOB. Les chaînes vides deviennent NULL, car Oracle les stocke ainsi, et le rapport les compte.

### Et les fonctions, les déclencheurs et les vues ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

### Sur quelles versions de Oracle le script se charge-t-il ?

Oracle 19c et versions ultérieures. Chaque dump de test se charge sur 21c et 23ai, et s'arrête à la première erreur en cas de problème.

## Depuis PostgreSQL

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

## Vers Oracle

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

## Guide et toutes les paires

- [Oracle vers PostgreSQL](https://intosql.com/fr/oracle-en-postgresql)
- [Guide de migration de PostgreSQL vers Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Types de données de PostgreSQL vers Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Toutes les paires de bases de données](https://intosql.com/fr/migration-de-base-de-donnees)
