---
title: "Migrar PostgreSQL a Oracle en tu navegador"
description: "Migra una base de datos PostgreSQL a Oracle: convierte un archivo de pg_dump en un script con las mismas tablas, claves y datos, y un informe de cada cambio."
canonical: https://intosql.com/es/postgresql-a-oracle
last_updated: 2026-10-15
---

# Migrar PostgreSQL a Oracle en tu navegador

Suelta un volcado plano de pg_dump o pg_dumpall, en .sql o .sql.gz, y descarga un script de Oracle con las mismas tablas, claves, índices y datos. Cada valor que Oracle no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.

[Guía de migración de PostgreSQL a Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Tipos de datos de PostgreSQL a Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Qué cambia de PostgreSQL a Oracle

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

| En PostgreSQL | En Oracle | Línea del informe |
| --- | --- | --- |
| boolean | NUMBER(1) con un CHECK de 0 y 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), contando caracteres |  |
| text | VARCHAR2(4000 CHAR) cuando cada valor cabe en 4000 bytes (750 caracteres en una clave), si no CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | comparación exacta | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER cuando sus valores caben en 38 dígitos, si no VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) con el texto de PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB con un arreglo JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 o CLOB con el texto de PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE en UTC |  |
| time | INTERVAL DAY TO SECOND desde la medianoche |  |
| 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 | sin NOT NULL | `not_null_relaxed` |
| enum types | VARCHAR2 con un CHECK de sus etiquetas |  |
| enum columns holding values outside their labels | VARCHAR2 sin CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER con el valor de los bits hasta 63 bits; dígitos en texto si son más |  |
| oid, xid, cid | NUMBER(10) con un CHECK de que no sea negativo |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, siguiendo después del id más alto |  |
| a second serial or identity column in a table | un entero simple | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, en el valor que había alcanzado |  |
| generated columns | columnas virtuales | `stored_as_virtual` |
| generated columns with functions Oracle lacks | una columna simple con los valores | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | sin valor predeterminado | `default_not_translated` |
| CHECK constraints | traducido, en línea en CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | no se crea | `check_skipped` |
| CHECK ... NOT VALID | no se crea | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | no se crea | `index_skipped` |
| foreign keys | después de los datos, ENABLE NOVALIDATE, luego validada con una advertencia si hay huérfanas |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | se descarta | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | no se crea | `foreign_key_skipped` |
| names over 128 bytes | acortado | `name_shortened` |
| partitioned tables | una tabla con las filas de todas las particiones | `partitions_dropped` |
| schemas | un esquema, con el nombre del esquema delante de cada tabla | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listados en el informe | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipos leídos de los valores | `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 | los bytes incorrectos como carácter de reemplazo | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | se copia tal cual | `mojibake_suspected` |

## Carga el script en Oracle

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

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

Las claves foráneas se agregan ENABLE NOVALIDATE, así que las filas nuevas se comprueban de inmediato, y luego se validan. Si una fila antigua apunta a una fila que no existe, el script dice qué restricción es y la deja sin validar, en lugar de fallar a medias.

Para un volcado grande, ejecuta SQL*Plus en la misma máquina que la base de datos. El script confirma cada 100 filas. El usuario que lo ejecuta necesita CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER y CREATE PROCEDURE, y cuota en su tablespace.

## Haz el volcado de PostgreSQL para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

- --format=plain, el formato predeterminado de pg_dump, escribe SQL. Un archivo custom o de directorio (-Fc, -Fd) pasa a SQL con pg_restore -f dump.sql, sin un servidor de base de datos.
- --no-owner --no-privileges dejan fuera los roles y los permisos, que el convertidor omite de todos modos, así que el volcado es más pequeño.
- pg_dumpall vuelca todas las bases de datos en un archivo; las tablas de cada una llevan su nombre, así que nada choca.

## Qué no se convierte

Las vistas, vistas materializadas, funciones, procedimientos, disparadores, reglas, políticas de seguridad de filas, extensiones y tipos se escriben en el lenguaje propio de PostgreSQL. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para Oracle.

## Preguntas sobre PostgreSQL a Oracle

### ¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

### ¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

### ¿Lee archivos de pg_dump -Fc?

No directamente: un archivo custom tiene formato binario. pg_restore -f dump.sql dump.backup lo pasa al SQL plano que lee el convertidor, sin conectarse a un servidor. El convertidor lo indica cuando recibe un archivo así.

### ¿De qué versiones de PostgreSQL puede venir el volcado?

Volcados escritos por pg_dump y pg_dumpall de PostgreSQL 10 en adelante, con filas COPY o INSERT. Cada volcado de prueba viene de PostgreSQL 13 y 18 y se compara con su origen celda por celda.

### ¿Se conservan los valores serial e identity?

Sí. La columna serial o identity de cada tabla se vuelve una columna de identidad, cada fila conserva su id y el siguiente id sigue después del más alto. Las secuencias que no pertenecen a una columna se vuelven secuencias de Oracle en el valor que habían alcanzado.

### ¿Qué pasa con los arreglos, los enum y otros tipos de PostgreSQL?

Los arreglos se vuelven arreglos JSON, los booleanos NUMBER(1), los timestamps con zona horaria TIMESTAMP WITH TIME ZONE, y el texto VARCHAR2 cuando sus valores caben, si no CLOB. Las cadenas vacías se vuelven NULL, como las guarda Oracle, y el informe las cuenta.

### ¿Qué pasa con las funciones, los disparadores y las vistas?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.

### ¿En qué versiones de Oracle carga el script?

Oracle 19c y posteriores. Cada volcado de prueba carga en 21c y 23ai, y se detiene en el primer error si algo sale mal.

## Desde PostgreSQL

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

## Hacia Oracle

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

## Guía y todos los pares

- [Oracle a PostgreSQL](https://intosql.com/es/oracle-a-postgresql)
- [Guía de migración de PostgreSQL a Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Tipos de datos de PostgreSQL a Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Todos los pares de bases de datos](https://intosql.com/es/migracion-de-bases-de-datos)
