---
title: "Migrar PostgreSQL para Oracle no navegador"
description: "Migre um banco PostgreSQL para Oracle: converta um arquivo do pg_dump em um script com as mesmas tabelas, chaves e dados, e um relatório de cada mudança."
canonical: https://intosql.com/pt-br/postgresql-para-oracle
last_updated: 2026-10-15
---

# Migrar PostgreSQL para Oracle no navegador

Solte um dump simples do pg_dump ou pg_dumpall, em .sql ou .sql.gz, e baixe um script do Oracle com as mesmas tabelas, chaves, índices e dados. Cada valor que o Oracle não aceita como está, e cada objeto que ele não traz, aparece no relatório.

[Guia de migração de PostgreSQL para Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

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

## O que muda do PostgreSQL para o Oracle

Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.

| No PostgreSQL | No Oracle | Linha do relatório |
| --- | --- | --- |
| boolean | NUMBER(1) com um CHECK de 0 e 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), contando caracteres |  |
| text | VARCHAR2(4000 CHAR) quando todo valor cabe em 4000 bytes (750 caracteres em uma chave), senão CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | comparação exata | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER quando seus valores cabem em 38 dígitos, senão VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) com o texto do PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB com um array JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 ou CLOB com o texto do PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE em UTC |  |
| time | INTERVAL DAY TO SECOND desde a meia-noite |  |
| 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 removido | `not_null_relaxed` |
| enum types | VARCHAR2 com um CHECK dos rótulos |  |
| enum columns holding values outside their labels | VARCHAR2 sem CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER com o valor dos bits até 63 bits; dígitos em texto acima disso |  |
| oid, xid, cid | NUMBER(10) com um CHECK de que não é negativo |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, continuando depois do maior id |  |
| a second serial or identity column in a table | um inteiro simples | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, no valor que tinha alcançado |  |
| generated columns | colunas virtuais | `stored_as_virtual` |
| generated columns with functions Oracle lacks | uma coluna simples com os valores | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | sem valor padrão | `default_not_translated` |
| CHECK constraints | traduzido, dentro do CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | não criado | `check_skipped` |
| CHECK ... NOT VALID | não criado | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | não criado | `index_skipped` |
| foreign keys | depois dos dados ENABLE NOVALIDATE, e então validada com um aviso sobre órfãos |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | descartado | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | não criada | `foreign_key_skipped` |
| names over 128 bytes | encurtados | `name_shortened` |
| partitioned tables | uma tabela com as linhas de todas as partições | `partitions_dropped` |
| schemas | um schema, tabelas com o nome do schema na frente | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listados no relatório | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipos lidos dos 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 | os bytes inválidos como o caractere de substituição | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copiado como está | `mojibake_suspected` |

## Carregue o script no Oracle

O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.

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

As chaves estrangeiras são adicionadas ENABLE NOVALIDATE, então as linhas novas são verificadas na hora, e depois validadas. Se uma linha antiga aponta para uma linha que não existe, o script informa qual restrição e a deixa sem validação, em vez de falhar no meio do caminho.

Para um dump grande, execute o SQL*Plus na mesma máquina do banco de dados. O script faz commit a cada 100 linhas. O usuário que o executa precisa de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER e CREATE PROCEDURE, e de cota no seu tablespace.

## Gere o dump do PostgreSQL para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

- --format=plain, o padrão do pg_dump, escreve SQL. Um arquivo custom ou de diretório (-Fc, -Fd) vira SQL com pg_restore -f dump.sql, sem servidor de banco de dados.
- --no-owner --no-privileges deixam de fora papéis e permissões, que o conversor ignora de qualquer forma, então o dump fica menor.
- O pg_dumpall gera o dump de todos os bancos de dados em um arquivo; as tabelas de cada um recebem o nome dele, então nada colide.

## O que não é convertido

Visões, visões materializadas, funções, procedimentos, gatilhos, regras, políticas de segurança de linha, extensões e tipos são escritos na linguagem própria do PostgreSQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o Oracle.

## Perguntas sobre PostgreSQL para Oracle

### Meu dump é enviado?

Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.

### Qual o tamanho máximo do dump?

O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.

### Ele lê arquivos do pg_dump -Fc?

Não diretamente: um arquivo custom é um formato binário. pg_restore -f dump.sql dump.backup o transforma no SQL simples que o conversor lê, sem se conectar a um servidor. O conversor avisa quando recebe um arquivo desses.

### De quais versões do PostgreSQL o dump pode vir?

Dumps escritos pelo pg_dump e pg_dumpall do PostgreSQL 10 em diante, com linhas em COPY ou INSERT. Cada dump de teste vem do PostgreSQL 13 e 18 e é comparado com a origem célula por célula.

### Os valores serial e identity são mantidos?

Sim. A coluna serial ou identity de cada tabela vira uma coluna identity, cada linha mantém seu id, e o próximo id continua depois do maior. Sequências que não pertencem a uma coluna viram sequências do Oracle no valor que tinham alcançado.

### O que acontece com arrays, enums e outros tipos do PostgreSQL?

Arrays viram arrays JSON, booleanos NUMBER(1), timestamps com fuso horário TIMESTAMP WITH TIME ZONE, e texto VARCHAR2 quando seus valores cabem, senão CLOB. Strings vazias viram NULL, pois é assim que o Oracle as guarda, e o relatório as conta.

### E as funções, gatilhos e visões?

Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.

### Em quais versões do Oracle o script carrega?

Oracle 19c e posteriores. Cada dump de teste carrega no 21c e no 23ai e para no primeiro erro se algo der errado.

## De PostgreSQL

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

## Para Oracle

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

## Guia e todos os pares

- [Oracle para PostgreSQL](https://intosql.com/pt-br/oracle-para-postgresql)
- [Guia de migração de PostgreSQL para Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Tipos de dados de PostgreSQL para Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Todos os pares de bancos de dados](https://intosql.com/pt-br/migracao-de-banco-de-dados)
