---
title: "Migracja PostgreSQL do Oracle w przeglądarce"
description: "Migruj bazę PostgreSQL do Oracle: zamień plik pg_dump w skrypt z tymi samymi tabelami, kluczami i danymi oraz raportem każdej zmiany."
canonical: https://intosql.com/pl/postgresql-do-oracle
last_updated: 2026-10-15
---

# Migracja PostgreSQL do Oracle w przeglądarce

Upuść zwykły zrzut z pg_dump lub pg_dumpall jako .sql lub .sql.gz i pobierz skrypt Oracle z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której Oracle nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

[Przewodnik migracji PostgreSQL do Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)

[Typy danych z PostgreSQL do Oracle](https://intosql.com/docs/types/postgresql-to-oracle)

## Co zmienia się między PostgreSQL a Oracle

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

| W PostgreSQL | W Oracle | Wpis w raporcie |
| --- | --- | --- |
| boolean | NUMBER(1) z CHECK 0 i 1 |  |
| varchar(n), char(n) | VARCHAR2(n CHAR), liczony w znakach |  |
| text | VARCHAR2(4000 CHAR), gdy każda wartość mieści się w 4000 bajtach (750 znakach w kluczu), w przeciwnym razie CLOB | `text_as_lob` |
| empty strings and empty bytea values | NULL | `empty_string_null` |
| citext | dokładne porównanie | `case_insensitive_collation` |
| numeric(p,s) past 38 digits; numeric without a precision | NUMBER, gdy wartości mieszczą się w 38 cyfrach, w przeciwnym razie VARCHAR2 | `decimal_as_text` |
| money | NUMBER(19,2) | `type_replaced` |
| interval | VARCHAR2(100 CHAR) z tekstem PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | CLOB z tablicą JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | VARCHAR2 lub CLOB z tekstem PostgreSQL | `type_replaced` |
| json, jsonb | CLOB |  |
| timestamp | TIMESTAMP |  |
| timestamp with time zone | TIMESTAMP WITH TIME ZONE w UTC |  |
| time | INTERVAL DAY TO SECOND od północy |  |
| 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 usunięte | `not_null_relaxed` |
| enum types | VARCHAR2 z CHECK jego etykiet |  |
| enum columns holding values outside their labels | VARCHAR2 bez CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | VARCHAR2 |  |
| bytea | BLOB |  |
| bit(n), bit varying | NUMBER z wartością bitów do 63 bitów; powyżej cyfry jako tekst |  |
| oid, xid, cid | NUMBER(10) z CHECK, że wartość nie jest ujemna |  |
| serial, identity | GENERATED BY DEFAULT ON NULL AS IDENTITY, kontynuowane po najwyższym id |  |
| a second serial or identity column in a table | zwykła liczba całkowita | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE, od osiągniętej wartości |  |
| generated columns | kolumny wirtualne | `stored_as_virtual` |
| generated columns with functions Oracle lacks | zwykła kolumna z wartościami | `generated_not_translated` |
| defaults with functions Oracle lacks, and defaults from a sequence | brak wartości domyślnej | `default_not_translated` |
| CHECK constraints | przetłumaczone, wewnątrz CREATE TABLE |  |
| CHECK constraints with functions Oracle lacks | nie jest tworzone | `check_skipped` |
| CHECK ... NOT VALID | nie jest tworzone | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on CLOB columns | nie jest tworzone | `index_skipped` |
| foreign keys | po danych z ENABLE NOVALIDATE, potem walidowany z ostrzeżeniem o osieroconych wierszach |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | usunięte | `foreign_key_action_unsupported` |
| foreign keys to tables the dump doesn't create | nie jest tworzone | `foreign_key_skipped` |
| names over 128 bytes | skrócone | `name_shortened` |
| partitioned tables | jedna tabela z wierszami wszystkich partycji | `partitions_dropped` |
| schemas | jeden schemat, nazwa każdej tabeli zaczyna się od nazwy jej schematu | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | wymienione w raporcie | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | typy odczytane z wartości | `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 | błędne bajty jako znak zastępczy | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | skopiowane bez zmian | `mojibake_suspected` |

## Załaduj skrypt do Oracle

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są dodawane z ENABLE NOVALIDATE, więc nowe wiersze są sprawdzane od razu, a potem walidowane. Jeśli stary wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, i zostawia je niezwalidowane, zamiast przerwać w połowie.

Przy dużym zrzucie uruchom SQL*Plus na tej samej maszynie co baza danych. Skrypt zatwierdza co 100 wierszy. Użytkownik, który go uruchamia, potrzebuje CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER i CREATE PROCEDURE oraz limitu w swojej przestrzeni tabel.

## Jak zrobić zrzut PostgreSQL dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

- --format=plain, domyślny w pg_dump, zapisuje SQL. Archiwum custom lub directory (-Fc, -Fd) zamienisz na SQL poleceniem pg_restore -f dump.sql, bez serwera bazy danych.
- --no-owner --no-privileges pomijają role i uprawnienia, które konwerter i tak pomija, więc zrzut jest mniejszy.
- pg_dumpall zapisuje każdą bazę danych w jednym pliku; nazwy tabel każdej z nich zaczynają się od jej nazwy, więc nic się nie powtarza.

## Co nie jest konwertowane

Widoki, widoki zmaterializowane, funkcje, procedury, wyzwalacze, reguły, polityki bezpieczeństwa wierszy, rozszerzenia i typy są pisane we własnym języku PostgreSQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla Oracle.

## Pytania o konwersję PostgreSQL do Oracle

### Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

### Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

### Czy odczytuje archiwa pg_dump -Fc?

Nie bezpośrednio: archiwum custom to format binarny. pg_restore -f dump.sql dump.backup zamienia je na zwykły SQL, który czyta konwerter, bez łączenia z serwerem. Konwerter informuje o tym, gdy dostanie archiwum.

### Z jakich wersji PostgreSQL może pochodzić zrzut?

Zrzuty zapisane przez pg_dump i pg_dumpall z PostgreSQL od wersji 10, z wierszami COPY lub INSERT. Każdy testowy zrzut pochodzi z PostgreSQL 13 i 18 i jest porównywany ze źródłem komórka po komórce.

### Czy wartości serial i identity są zachowywane?

Tak. Kolumna serial lub identity każdej tabeli staje się kolumną identity, każdy wiersz zachowuje swoje id, a kolejne id idzie po najwyższym. Sekwencje niepowiązane z kolumną stają się sekwencjami Oracle od osiągniętej wartości.

### Co dzieje się z tablicami, typami enum i innymi typami PostgreSQL?

Tablice stają się tablicami JSON, wartości logiczne NUMBER(1), znaczniki czasu ze strefą TIMESTAMP WITH TIME ZONE, a tekst VARCHAR2, gdy wartości się mieszczą, w przeciwnym razie CLOB. Puste ciągi stają się NULL, bo tak zapisuje je Oracle, a raport je liczy.

### A funkcje, wyzwalacze i widoki?

Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.

### Na jakich wersjach Oracle ładuje się skrypt?

Oracle 19c i nowsze. Każdy testowy zrzut ładuje się na 21c i 23ai i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.

## Z PostgreSQL

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

## Do Oracle

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

## Przewodnik i każda para

- [Oracle do PostgreSQL](https://intosql.com/pl/oracle-do-postgresql)
- [Przewodnik migracji PostgreSQL do Oracle](https://intosql.com/docs/migrations/postgresql-to-oracle)
- [Typy danych z PostgreSQL do Oracle](https://intosql.com/docs/types/postgresql-to-oracle)
- [Każda para baz danych](https://intosql.com/pl/migracja-bazy-danych)
