Przejdź do treści
Strona główna IntoSQL

Konwertuj Oracle do PostgreSQL

Upuść plik .sql zapisany przez Database Export w SQL Developer lub przez SQLcl, z tabelami i instrukcjami Insert, i pobierz skrypt PostgreSQL z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której PostgreSQL nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

Twój plik
sqlshop_2024_oracle.sqlPlik przykładowy, 9,3 kB
Twoja baza danych

18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_oracle.sqlZrzut Oracle · zapisany przez SQL Developer · utf-8

  • customers8 wierszy
    7 kolumn
    idbigint not null
    namevarchar(100) not null
    emailvarchar(150) not null
    countryvarchar(2) not null
    is_activesmallint not null
    signed_uptimestamp(0)
    created_attimestamp(0) not null
  • orders10 wierszy
    9 kolumn
    idbigint not null
    customer_idbigint not null
    invoicebigint
    statusvarchar(10) not null
    totalnumeric(10,2) not null
    itemsinteger not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(0)
    notevarchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE SEQUENCE invoice_numbers INCREMENT BY 1 MINVALUE 1 START WITH 1020;
CREATE TABLE customers (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name varchar(100) NOT NULL,
    email varchar(150) NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active smallint DEFAULT 1 NOT NULL,
    signed_up timestamp(0),
    created_at timestamp(0) DEFAULT LOCALTIMESTAMP NOT NULL,
    CONSTRAINT customers_check1 CHECK (is_active IN (0, 1))
);

CREATE TABLE orders (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id bigint NOT NULL,
    invoice bigint DEFAULT (nextval('invoice_numbers')),
    status varchar(10) DEFAULT 'pending' NOT NULL,
    total numeric(10,2) NOT NULL,
    items integer DEFAULT 1 NOT NULL,
    ordered_at timestamp(0) NOT NULL,
    shipped_at timestamp(0),
    note varchar(255),
    CONSTRAINT orders_check1 CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled'))
);

COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	1	2023-01-15 00:00:00	2023-01-15 10:24:00.000000
2	Zoë Müller	zoe@example.de	DE	1	2023-02-03 00:00:00	2023-02-03 08:11:42.000000
3	José Peña	jose@example.es	ES	0	2023-03-21 00:00:00	2023-03-21 19:05:17.000000
4	李雷	lilei@example.cn	CN	1	2023-05-09 00:00:00	2023-05-09 02:40:00.000000
5	Noah O'Brien	noah@example.ie	IE	1	\N	2023-06-30 14:00:00.000000
6	Amélie Laurent	amelie@example.fr	FR	1	2024-01-02 00:00:00	2024-01-02 09:30:00.000000
7	Ravi Patel	ravi@example.in	IN	0	2024-02-29 00:00:00	2024-02-29 23:59:59.000000
8	Sofia Rossi 🌻	sofia@example.it	IT	1	2024-04-12 00:00:00	2024-04-12 12:12:12.000000
\.

COPY orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) FROM stdin;
1	1	1000	shipped	129.9	3	2024-03-01 10:00:00	2024-03-02 16:30:00	\N
2	2	1001	paid	54	1	2024-03-02 11:15:00	\N	Gift wrap 🎁
3	1	1002	cancelled	12.5	1	2024-03-03 09:45:00	\N	Customer changed their mind
4	4	1003	shipped	980	12	2024-03-05 02:10:00	2024-03-07 08:00:00	请小心轻放
5	5	1004	pending	45.75	2	2024-03-08 17:20:00	\N	Leave at the door; ring twice
6	6	1005	shipped	310.4	5	2024-03-10 13:00:00	2024-03-11 09:00:00	Fragile: "glass"
7	8	1006	paid	76.2	2	2024-03-11 18:45:00	\N	\N
8	2	1007	paid	19.99	1	2024-03-12 08:00:00	\N	Paid at the counter
9	3	1008	shipped	64	2	2024-03-14 15:30:00	\N	Shipping date never recorded
10	7	1009	paid	1499	1	2024-03-15 21:05:00	\N	C:\\Users\\ravi\\invoice.pdf
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX customers_customers_pk ON customers (id);
CREATE UNIQUE INDEX customers_customers_email_uk ON customers (email);
CREATE UNIQUE INDEX orders_orders_pk ON orders (id);
CREATE INDEX orders_orders_status_date_ix ON orders (status, ordered_at);
ALTER TABLE customers ADD CONSTRAINT customers_customers_pk PRIMARY KEY USING INDEX customers_customers_pk;
ALTER TABLE customers ADD CONSTRAINT customers_customers_email_uk UNIQUE USING INDEX customers_customers_email_uk;
ALTER TABLE orders ADD CONSTRAINT orders_orders_pk PRIMARY KEY USING INDEX orders_orders_pk;
ALTER TABLE orders ADD CONSTRAINT orders_customer_fk FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT orders_customer_fk;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_customer_fk';
END $f$;
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1), 9223372036854775807)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 1), 9223372036854775807)::bigint, false);

Poprawki

Nic nie wymagało poprawek.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między Oracle a PostgreSQL

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

  • BOOLEAN (23ai)

    boolean

    TRUE i FALSE pozostają true i false.

  • VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG

    varchar(n) i text

    Długości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.

  • NUMBER, NUMBER(p,s), FLOAT(b)

    numeric(p,s) lub bigint

    NUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.

  • DATE, TIMESTAMP(p)

    timestamp(p)

    DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.

  • TIMESTAMP(7) to TIMESTAMP(9)

    sześć cyfr ułamka sekundy, siódma obcięta

    PostgreSQL przechowuje mikrosekundy; siódma cyfra (100 nanosekund) jest obcinana, nigdy zaokrąglana, więc żadna wartość nie przechodzi na następną sekundę ani dzień.

    Wpis w raporcie: fraction_cut

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    timestamptz, te same momenty

    timestamptz zachowuje moment; PostgreSQL pokazuje go w strefie czasowej sesji zamiast przesunięcia, które miała każda wartość.

  • JSON (21c), and CLOB holding JSON

    jsonb

    Te same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.

  • BLOB, RAW(n), LONG RAW

    bytea

    Bajty pozostają bajtami.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    text oraz xml dla XMLTYPE

    Własne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.

    Wpis w raporcie: type_replaced

  • collations that ignore case (BINARY_CI)

    dokładne porównanie

    PostgreSQL porównuje tekst dokładnie, więc kolumny, które w Oracle ignorowały wielkość liter, teraz odróżniają Ana od ana.

    Wpis w raporcie: case_insensitive_collation

  • identity columns, and a sequence a BEFORE INSERT trigger assigns

    GENERATED BY DEFAULT AS IDENTITY, kontynuowane po najwyższym id

    Skopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.

  • CREATE SEQUENCE

    CREATE SEQUENCE z tymi samymi opcjami

    Eksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.

  • virtual columns (GENERATED ALWAYS AS ... VIRTUAL)

    kolumny generowane, STORED

    PostgreSQL od 13 do 17 tylko przechowuje kolumny generowane; formuła jest ta sama, z || zapisanym tak, by NULL liczył się jako pusty, jak w Oracle.

    Wpis w raporcie: virtual_as_stored

  • virtual columns with functions IntoSQL doesn't write, and the || operator

    zwykła kolumna

    Formuła, której nie da się zapisać dla PostgreSQL, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a PostgreSQL nie może ich obliczyć.

    Wpis w raporcie: generated_not_translated

  • defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać dla PostgreSQL, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone

    Te same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać dla PostgreSQL, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    nie jest tworzone

    Oracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.

    Wpis w raporcie: check_not_enforced

  • function-based, bitmap and domain indexes

    nie jest tworzone

    IntoSQL zapisuje indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys

    klucze obce, po wierszach

    Wiersze ładują się w dowolnej kolejności, a klucze sprawdzają je potem.

  • foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.

    Wpis w raporcie: foreign_key_skipped

  • partitioned tables

    jedna tabela z wierszami wszystkich partycji

    Wiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w PostgreSQL.

    Wpis w raporcie: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • views, synonyms, types, packages, procedures, functions and other triggers

    wymienione w raporcie

    Ich kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

  • exports without CREATE TABLE (data only)

    typy odczytane z wartości

    Eksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know, and object types

    text

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

  • dates before year 1 and time zones given as region names

    NULL

    Wartość, która nie jest datą, staje się NULL, a raport ją liczy.

    Wpis w raporcie: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN i Infinity zachowane

    Typy zmiennoprzecinkowe w PostgreSQL przechowują NaN i nieskończoność.

  • NUL characters in text

    usunięte

    Tekst w PostgreSQL nie może zawierać znaku NUL. Jest on usuwany, a raport liczy te wartości.

    Wpis w raporcie: nul_removed

  • text that isn't valid in its encoding

    błędne bajty jako znak zastępczy

    Tekst w PostgreSQL musi być poprawnym UTF-8.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Skrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W OracleW PostgreSQLWpis w raporcie
BOOLEAN (23ai)booleanTRUE i FALSE pozostają true i false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGvarchar(n) i textDługości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.
NUMBER, NUMBER(p,s), FLOAT(b)numeric(p,s) lub bigintNUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.
DATE, TIMESTAMP(p)timestamp(p)DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.
TIMESTAMP(7) to TIMESTAMP(9)sześć cyfr ułamka sekundy, siódma obciętaPostgreSQL przechowuje mikrosekundy; siódma cyfra (100 nanosekund) jest obcinana, nigdy zaokrąglana, więc żadna wartość nie przechodzi na następną sekundę ani dzień.fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEtimestamptz, te same momentytimestamptz zachowuje moment; PostgreSQL pokazuje go w strefie czasowej sesji zamiast przesunięcia, które miała każda wartość.
JSON (21c), and CLOB holding JSONjsonbTe same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.
BLOB, RAW(n), LONG RAWbyteaBajty pozostają bajtami.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYtext oraz xml dla XMLTYPEWłasne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.type_replaced
collations that ignore case (BINARY_CI)dokładne porównaniePostgreSQL porównuje tekst dokładnie, więc kolumny, które w Oracle ignorowały wielkość liter, teraz odróżniają Ana od ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT AS IDENTITY, kontynuowane po najwyższym idSkopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.
CREATE SEQUENCECREATE SEQUENCE z tymi samymi opcjamiEksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)kolumny generowane, STOREDPostgreSQL od 13 do 17 tylko przechowuje kolumny generowane; formuła jest ta sama, z || zapisanym tak, by NULL liczył się jako pusty, jak w Oracle.virtual_as_stored
virtual columns with functions IntoSQL doesn't write, and the || operatorzwykła kolumnaFormuła, której nie da się zapisać dla PostgreSQL, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a PostgreSQL nie może ich obliczyć.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)brak wartości domyślnejWartość domyślna, której nie da się zapisać dla PostgreSQL, jest pomijana i zgłaszana w raporcie.default_not_translated
CHECK constraintsprzetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać dla PostgreSQL, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnie jest tworzoneOracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.check_not_enforced
function-based, bitmap and domain indexesnie jest tworzoneIntoSQL zapisuje indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keysklucze obce, po wierszachWiersze ładują się w dowolnej kolejności, a klucze sprawdzają je potem.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.foreign_key_skipped
partitioned tablesjedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w PostgreSQL.partitions_dropped
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerswymienione w raporcieIch kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
exports without CREATE TABLE (data only)typy odczytane z wartościEksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT values other than the ones exports writeNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.expression_value
types IntoSQL doesn't know, and object typestextTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
dates before year 1 and time zones given as region namesNULLWartość, która nie jest datą, staje się NULL, a raport ją liczy.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN i Infinity zachowaneTypy zmiennoprzecinkowe w PostgreSQL przechowują NaN i nieskończoność.
NUL characters in textusunięteTekst w PostgreSQL nie może zawierać znaku NUL. Jest on usuwany, a raport liczy te wartości.nul_removed
text that isn't valid in its encodingbłędne bajty jako znak zastępczyTekst w PostgreSQL musi być poprawnym UTF-8.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianSkrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do PostgreSQL

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

psql -v ON_ERROR_STOP=1 -d mydb -f oracle.postgresql.sql

Klucze obce są dodawane jako NOT VALID, a potem sprawdzane. Jeśli wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, zamiast przerwać w połowie.

Przy dużym zrzucie najpierw utwórz bazę danych i uruchom skrypt przez psql na tej samej maszynie co serwer.

IntoSQL Pro ładuje plik prosto do PostgreSQL z aplikacji na komputer lub wiersza poleceń, bez pisania skryptu.

Jak zrobić zrzut Oracle dla najlepszego wyniku

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

  • W SQL Developer wybierz Tools, Database Export, z DDL i formatem danych Insert. SQLcl zapisuje to samo z SET SQLFORMAT INSERT.
  • Przed eksportem uruchom ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS': domyślny format zapisuje daty bez godziny i stulecia.
  • Plik .dmp z exp lub expdp jest binarny: zaimportuj go do bazy Oracle, np. Oracle Database Free w Dockerze, i wyeksportuj przez SQL Developer.

Co nie jest konwertowane

Widoki, pakiety, procedury, funkcje, wyzwalacze, typy i synonimy są pisane w PL/SQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla PostgreSQL.

Pytania o konwersję Oracle do PostgreSQL

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

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 mogę przekonwertować plik .dmp z exp lub expdp?

Nie bezpośrednio: Data Pump i oryginalny Export zapisują format binarny, który czyta tylko Oracle. Zaimportuj plik do dowolnej bazy Oracle (Oracle Database Free działa w Dockerze) i wyeksportuj go przez Database Export w SQL Developer lub przez SQLcl. Konwerter informuje o tym, gdy dostanie plik .dmp.

Z jakich wersji Oracle może pochodzić eksport?

Eksporty z SQL Developer i SQLcl, z definicjami tabel z DBMS_METADATA, z Oracle od wersji 11g. Każdy testowy eksport pochodzi z Oracle 21c i 23ai, w sesjach amerykańskich, niemieckich i ISO, i jest porównywany ze źródłem komórka po komórce.

Co dzieje się z NUMBER, DATE i innymi typami Oracle?

NUMBER staje się numeric lub bigint, gdy każda wartość jest liczbą całkowitą; DATE staje się timestamp i zachowuje godzinę; CLOB staje się text, BLOB i RAW bytea, BINARY_DOUBLE double precision z NaN i Infinity, a interwały interval.

Czy kolumny identity i sekwencje są zachowywane?

Tak. Kolumny identity pozostają kolumnami identity i idą dalej po najwyższym id, podobnie jak kolumna, którą wyzwalacz wypełnia z sekwencji. Sekwencje kontynuują od miejsca, do którego według eksportu doszły.

A pakiety PL/SQL, procedury i wyzwalacze?

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

Na jakich wersjach PostgreSQL ładuje się skrypt?

PostgreSQL od 13 do 18. Ten sam skrypt ładuje się na każdej z nich i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.