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

# Migrer une base Oracle vers PostgreSQL

Déposez le fichier .sql qu'écrit Database Export de SQL Developer ou SQLcl, avec ses tables et ses instructions Insert, et téléchargez un script PostgreSQL avec les mêmes tables, clés, index et données. Chaque valeur que PostgreSQL ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

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

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

## Ce qui change de Oracle à PostgreSQL

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 Oracle | Dans PostgreSQL | Ligne du rapport |
| --- | --- | --- |
| BOOLEAN (23ai) | boolean |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | varchar(n) et text |  |
| NUMBER, NUMBER(p,s), FLOAT(b) | numeric(p,s), ou bigint |  |
| DATE, TIMESTAMP(p) | timestamp(p) |  |
| TIMESTAMP(7) to TIMESTAMP(9) | six chiffres de seconde, le septième coupé | `fraction_cut` |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | timestamptz, les mêmes instants |  |
| JSON (21c), and CLOB holding JSON | jsonb |  |
| BLOB, RAW(n), LONG RAW | bytea |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | text, et xml pour XMLTYPE | `type_replaced` |
| collations that ignore case (BINARY_CI) | comparaison exacte | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | GENERATED BY DEFAULT AS IDENTITY, qui reprend après l'identifiant le plus élevé |  |
| CREATE SEQUENCE | CREATE SEQUENCE avec les mêmes options |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | colonnes générées, STORED | `virtual_as_stored` |
| virtual columns with functions IntoSQL doesn't write, and the || operator | une colonne simple | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites |  |
| CHECK constraints with functions IntoSQL doesn't write | non créée | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | non créée | `check_not_enforced` |
| function-based, bitmap and domain indexes | non créée | `index_skipped` |
| foreign keys | clés étrangères, après les lignes |  |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | non créée | `foreign_key_skipped` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | listés dans le rapport | `not_converted_objects` |
| exports without CREATE TABLE (data only) | types déduits des valeurs | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | text | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NaN et Infinity conservés |  |
| NUL characters in text | retiré | `nul_removed` |
| 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 PostgreSQL

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
psql -v ON_ERROR_STOP=1 -d mydb -f oracle.postgresql.sql
```

Les clés étrangères sont ajoutées en NOT VALID, puis validées. Si une ligne pointe vers une ligne qui n'existe pas, le script vous indique quelle contrainte, au lieu d'échouer à mi-chemin.

Pour un gros dump, créez d'abord la base de données et exécutez le script avec psql depuis la machine du serveur.

IntoSQL Pro charge le fichier directement dans PostgreSQL depuis l'application de bureau ou la ligne de commande, sans écrire de script.

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

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

- Dans SQL Developer, choisissez Tools, Database Export, avec DDL et le format de données Insert. SQLcl écrit la même chose avec SET SQLFORMAT INSERT.
- Exécutez ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' avant l'export : le format par défaut écrit les dates sans leur heure ni leur siècle.
- Un fichier .dmp de exp ou expdp est binaire : importez-le dans une base Oracle, par exemple Oracle Database Free dans Docker, et exportez-le avec SQL Developer.

## Ce qui n'est pas converti

Les vues, packages, procédures, fonctions, déclencheurs, types et synonymes sont écrits en PL/SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour PostgreSQL.

## Questions sur Oracle vers PostgreSQL

### 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.

### Puis-je convertir un fichier .dmp de exp ou expdp ?

Pas directement : Data Pump et l'Export d'origine écrivent un format binaire que seul Oracle lit. Importez-le dans n'importe quelle base Oracle, Oracle Database Free tourne dans Docker, et exportez-le avec Database Export de SQL Developer ou SQLcl. Le convertisseur le signale quand il reçoit un fichier .dmp.

### De quelles versions de Oracle l'export peut-il venir ?

Les exports de SQL Developer et SQLcl, avec les définitions de tables de DBMS_METADATA, depuis Oracle 11g. Chaque export de test vient de Oracle 21c et 23ai, dans des sessions américaine, allemande et ISO, et est comparé à sa source cellule par cellule.

### Que deviennent NUMBER, DATE et les autres types Oracle ?

NUMBER devient numeric, ou bigint si chaque valeur est un nombre entier ; DATE devient timestamp et garde son heure ; CLOB text, BLOB et RAW bytea, BINARY_DOUBLE double precision avec NaN et Infinity, et les intervalles interval.

### Les colonnes d'identité et les séquences sont-elles gardées ?

Oui. Les colonnes d'identité restent des colonnes d'identité et reprennent après l'identifiant le plus élevé, tout comme une colonne qu'un déclencheur remplit depuis une séquence. Les séquences reprennent là où l'export indique qu'elles en étaient.

### Et les packages, procédures et déclencheurs PL/SQL ?

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 PostgreSQL le script se charge-t-il ?

PostgreSQL 13 à 18. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.

## Depuis Oracle

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

## Vers PostgreSQL

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

## Guide et toutes les paires

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