Konwertuj Oracle do SQLite
Upuść plik .sql zapisany przez Database Export w SQL Developer lub przez SQLcl, z tabelami i instrukcjami Insert, i pobierz skrypt SQLite z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której SQLite nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.
18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych
Tabele w pliku shop_2024_oracle.sqlZrzut Oracle · zapisany przez SQL Developer · utf-8
customers8 wierszy
7 kolumn id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATETIME created_at DATETIME not null orders10 wierszy
9 kolumn id INTEGER not null customer_id INTEGER not null invoice INTEGER status VARCHAR(10) not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note VARCHAR(255)
-- Written by IntoSQL from a Oracle dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;
CREATE TABLE customers ( -- People who bought at least once
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
country VARCHAR(2) DEFAULT 'US' NOT NULL,
is_active INTEGER DEFAULT 1 NOT NULL,
signed_up DATETIME,
created_at DATETIME DEFAULT (datetime('now', 'localtime')) NOT NULL,
CONSTRAINT customers_check1 CHECK (is_active IN (0, 1))
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
invoice INTEGER,
status VARCHAR(10) DEFAULT 'pending' NOT NULL,
total DECIMAL(10,2) NOT NULL,
items INTEGER DEFAULT 1 NOT NULL,
ordered_at DATETIME NOT NULL,
shipped_at DATETIME,
note VARCHAR(255),
CONSTRAINT orders_check1 CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT orders_customer_fk FOREIGN KEY (customer_id) REFERENCES customers (id)
);
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000000');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf');
-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_customers_email_uk ON customers (email);
CREATE INDEX orders_orders_status_date_ix ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
COMMIT;
-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;
Poprawki
Nic nie wymagało poprawek.
Do sprawdzenia
- Pominięto 1 sekwencję; SQLite nie ma sekwencji. Przechowuj następną wartość w tabeli, jeśli twoja aplikacja jej potrzebuje.
- Wartości domyślnej "invoice" w tabeli orders nie da się zapisać dla SQLite (a sequence), więc kolumna nie ma wartości domyślnej. Dodaj wartość domyślną ręcznie, jeśli nowe wiersze jej potrzebują.
Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.
Inne przykłady:
Co zmienia się między Oracle a SQLite
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)
INTEGER 0 lub 1 z CHECK
SQLite nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
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)
INTEGER lub NUMERIC, powyżej 15 cyfr dokładnie jako tekst
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.
Wpis w raporcie: decimal_as_text
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
TEXT z tekstem Oracle, np. +01-06
SQLite nie ma typu interval; tekst zachowuje każdą część.
Wpis w raporcie: type_replaced
DATE, TIMESTAMP(p)
DATETIME jako tekst ISO 8601, ze wszystkimi cyframi
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 WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP jako tekst ISO 8601 w UTC
SQLite nie ma typu, który zachowuje przesunięcie, więc każdy moment jest zapisywany w UTC: ten sam moment niezależnie od przesunięcia.
Wpis w raporcie: moments_as_utc
JSON (21c), and CLOB holding JSON
TEXT
Te same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.
BLOB, RAW(n), LONG RAW
BLOB
Bajty pozostają bajtami.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
TEXT
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
SQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII.
Wpis w raporcie: case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assigns
INTEGER PRIMARY KEY AUTOINCREMENT, 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.
identity columns the target can't count
INTEGER bez licznika
SQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych.
Wpis w raporcie: counter_dropped
CREATE SEQUENCE
nie jest tworzone
Eksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.
Wpis w raporcie: sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
GENERATED ALWAYS AS, STORED przy PERSISTED, w przeciwnym razie VIRTUAL
SQLite oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane.
virtual columns with functions IntoSQL doesn't write, and the || operator
zwykła kolumna
Formuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a SQLite 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ć, 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ć, 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 całych kolumnach; pozostałe utwórz ponownie po załadowaniu.
Wpis w raporcie: index_skipped
foreign keys
w CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_check
SQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, a na końcu skrypt wypisuje każdy wiersz bez rodzica.
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 SQLite.
Wpis w raporcie: partitions_dropped
several schemas in one export
jeden plik, nazwa każdej tabeli zaczyna się od nazwy jej schematu
Plik SQLite to jedna baza danych, więc nazwa schematu rozróżnia tabele o tej samej nazwie; eksport jednego schematu zachowuje nazwy swoich tabel.
Wpis w raporcie: schemas_merged
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
Infinity jako 9e999; NaN jako NULL
SQLite odczytuje 9e999 jako nieskończoność i nie ma NaN.
NUL characters in text
zachowane
Tekst w SQLite może zawierać znak NUL, więc wartość jest kopiowana bez zmian.
text that isn't valid in its encoding
błędne bajty jako znak zastępczy
Skrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem.
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 Oracle | W SQLite | Wpis w raporcie |
|---|---|---|
| BOOLEAN (23ai) | INTEGER 0 lub 1 z CHECKSQLite nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0. | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | 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) | INTEGER lub NUMERIC, powyżej 15 cyfr dokładnie jako tekstNUMBER 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. | decimal_as_text |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | TEXT z tekstem Oracle, np. +01-06SQLite nie ma typu interval; tekst zachowuje każdą część. | type_replaced |
| DATE, TIMESTAMP(p) | DATETIME jako tekst ISO 8601, ze wszystkimi cyframiDATE 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 WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | TIMESTAMP jako tekst ISO 8601 w UTCSQLite nie ma typu, który zachowuje przesunięcie, więc każdy moment jest zapisywany w UTC: ten sam moment niezależnie od przesunięcia. | moments_as_utc |
| JSON (21c), and CLOB holding JSON | TEXTTe same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL. | |
| BLOB, RAW(n), LONG RAW | BLOBBajty pozostają bajtami. | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | TEXTWł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ównanieSQLite porównuje tekst dokładnie, chyba że ustawisz inaczej, a jego NOCASE ujednolica tylko litery ASCII. | case_insensitive_collation |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | INTEGER PRIMARY KEY AUTOINCREMENT, 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. | |
| identity columns the target can't count | INTEGER bez licznikaSQLite liczy tylko kolumnę, która jest całym kluczem głównym, więc kolumna zachowuje swoje wartości, a nowe wiersze potrzebują własnych. | counter_dropped |
| CREATE SEQUENCE | nie jest tworzoneEksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca. | sequence_not_converted |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | GENERATED ALWAYS AS, STORED przy PERSISTED, w przeciwnym razie VIRTUALSQLite oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane. | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | zwykła kolumnaFormuła, której nie da się zapisać dla SQLite, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a SQLite 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ć, jest pomijana i zgłaszana w raporcie. | default_not_translated |
| CHECK constraints | przetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza. | |
| CHECK constraints with functions IntoSQL doesn't write | nie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie. | check_skipped |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | nie 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 indexes | nie jest tworzoneIntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu. | index_skipped |
| foreign keys | w CREATE TABLE, ładowane bez sprawdzania, potem wypisywane przez PRAGMA foreign_key_checkSQLite przyjmuje klucze obce tylko w CREATE TABLE i sprawdza je tylko z włączonym PRAGMA foreign_keys. Wiersze ładują się bez sprawdzania, a na końcu skrypt wypisuje każdy wiersz bez rodzica. | |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | nie 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 tables | jedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w SQLite. | partitions_dropped |
| several schemas in one export | jeden plik, nazwa każdej tabeli zaczyna się od nazwy jej schematuPlik SQLite to jedna baza danych, więc nazwa schematu rozróżnia tabele o tej samej nazwie; eksport jednego schematu zachowuje nazwy swoich tabel. | schemas_merged |
| NOT NULL columns with values that become NULL | NOT 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 triggers | wymienione 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 write | NULLKonwerter, 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 types | TEXTTekst mieści każdą wartość; zmień typ po załadowaniu. | unknown_type |
| dates before year 1 and time zones given as region names | NULLWartość, która nie jest datą, staje się NULL, a raport ją liczy. | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | Infinity jako 9e999; NaN jako NULLSQLite odczytuje 9e999 jako nieskończoność i nie ma NaN. | |
| NUL characters in text | zachowaneTekst w SQLite może zawierać znak NUL, więc wartość jest kopiowana bez zmian. | |
| text that isn't valid in its encoding | błędne bajty jako znak zastępczySkrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem. | 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 SQLite
Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.
sqlite3 -bail mydb.sqlite < oracle.sqlite.sqlKlucze obce są deklarowane w każdej tabeli, a wiersze ładują się z wyłączonym sprawdzaniem kluczy obcych. Potem skrypt wypisuje każdy wiersz, który wskazuje na nieistniejący wiersz, zamiast przerwać w połowie.
Duży zrzut ładuj do nowego pliku na dysku lokalnym. Skrypt ładuje wszystko w jednej transakcji z wyłączoną synchronizacją, więc działa z szybkością dysku, a przerwane ładowanie nie zostawia niepełnych tabel.
Wiersz poleceń ładuje plik prosto do bazy SQLite, bez pisania skryptu. To nic nie kosztuje.
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 SQLite.
Pytania o konwersję Oracle do SQLite
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ę INTEGER dla liczb całkowitych, a w innym razie zachowuje każdą cyfrę; DATE staje się tekstem DATETIME z godziną; CLOB staje się TEXT, BLOB i RAW BLOB. Infinity jest zachowywane; NaN staje się NULL.
Czy kolumny identity i sekwencje są zachowywane?
Kolumna identity, która stanowi cały klucz główny tabeli, staje się INTEGER PRIMARY KEY AUTOINCREMENT i idzie dalej po najwyższym id. SQLite nie ma sekwencji, więc trafiają one do raportu.
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 SQLite ładuje się skrypt?
SQLite 3.31 i nowsze. Każdy testowy eksport ładuje się na 3.31 i 3.54 i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.