Zum Inhalt springen
IntoSQL-Startseite

Oracle in SQLite umwandeln

Leg die .sql-Datei ab, die Database Export in SQL Developer oder SQLcl schreibt, mit ihren Tabellen und Insert-Anweisungen, und lade ein SQLite-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQLite nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

Deine Datei
sqlshop_2024_oracle.sqlBeispieldatei, 9,3 kB
Deine Datenbank

18 Zeilen konvertiert, keine Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_oracle.sqlOracle-Dump · erstellt mit SQL Developer · utf-8

  • customers8 Zeilen
    7 Spalten
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATETIME
    created_atDATETIME not null
  • orders10 Zeilen
    9 Spalten
    idINTEGER not null
    customer_idINTEGER not null
    invoiceINTEGER
    statusVARCHAR(10) not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(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;

Korrekturen

Nichts musste korrigiert werden.

Zu prüfen

  • 1 Sequenz wird nicht angelegt; SQLite hat keine Sequenzen. Speichere den nächsten Wert in einer Tabelle, wenn deine Anwendung ihn braucht.
  • Der Standardwert von "invoice" in orders lässt sich nicht für SQLite schreiben (a sequence), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von Oracle zu SQLite ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

  • BOOLEAN (23ai)

    INTEGER 0 oder 1 mit einem CHECK

    SQLite hat keine boolesche Spalte, daher sind TRUE und FALSE 1 und 0.

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

    TEXT

    Längen zählen Zeichen, ob Oracle Bytes oder Zeichen gezählt hat, damit jeder Wert passt.

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

    INTEGER oder NUMERIC, über 15 Stellen exakt als Text

    NUMBER behält jede Stelle; ein NUMBER ohne Genauigkeit, dessen Werte alle ganze Zahlen mit bis zu 18 Stellen sind, wird eine 64-Bit-Ganzzahl, und eine negative Skalierung fasst entsprechend viele Stellen vor dem Komma.

    Berichtszeile: decimal_as_text

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    TEXT mit dem Text von Oracle, etwa +01-06

    SQLite hat keinen interval-Typ; der Text behält jeden Teil.

    Berichtszeile: type_replaced

  • DATE, TIMESTAMP(p)

    DATETIME als ISO-8601-Text, jede Stelle erhalten

    DATE in Oracle enthält eine Uhrzeit auf die Sekunde, daher ist es Datum und Uhrzeit. Ein Export in einer amerikanischen oder deutschen Sitzung schreibt Datumswerte ohne Uhrzeit und Jahrhundert (DD-MON-RR); exportiere in einer ISO-Sitzung (SYYYY-MM-DD HH24:MI:SS), um sie zu behalten.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    TIMESTAMP als ISO-8601-Text in UTC

    SQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz er auch hatte.

    Berichtszeile: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    TEXT

    Dieselben JSON-Werte; ein SQL-NULL, das der Export als 'null' geschrieben hat, bleibt NULL.

  • BLOB, RAW(n), LONG RAW

    BLOB

    Bytes bleiben Bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    TEXT

    Die eigenen Typen von Oracle haben keine Entsprechung; ihre Werte behalten ihren Text, ROWID-Werte eingeschlossen, auch wenn sie außerhalb von Oracle nichts bedeuten.

    Berichtszeile: type_replaced

  • collations that ignore case (BINARY_CI)

    exakter Vergleich

    SQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.

    Berichtszeile: case_insensitive_collation

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

    INTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten ID

    Die kopierten IDs laden unverändert, und der Zähler macht nach der höchsten weiter. Eine Spalte, die ein Trigger aus einer Sequenz füllt (der Weg vor 12c), wird ebenfalls eine Identity-Spalte.

  • identity columns the target can't count

    INTEGER ohne Zähler

    SQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.

    Berichtszeile: counter_dropped

  • CREATE SEQUENCE

    nicht angelegt

    Der Export schreibt den Stand einer Sequenz als ihr START WITH, daher macht sie dort weiter.

    Berichtszeile: sequence_not_converted

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

    GENERATED ALWAYS AS, STORED bei PERSISTED, sonst VIRTUAL

    SQLite berechnet sie aus derselben Formel; die Werte, die der Export für sie geschrieben hat, werden weggelassen.

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

    eine normale Spalte

    Eine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; die Werte, die der Export für virtuelle Spalten geschrieben hat, werden weggelassen, und SQLite kann sie nicht berechnen.

    Berichtszeile: generated_not_translated

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

    kein Standardwert

    Ein Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt

    Dieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.

  • CHECK constraints with functions IntoSQL doesn't write

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    nicht angelegt

    Oracle wendet diese CHECK-Bedingungen nicht auf die bereits vorhandenen Zeilen an, daher können die Zeilen sie verletzen.

    Berichtszeile: check_not_enforced

  • function-based, bitmap and domain indexes

    nicht angelegt

    IntoSQL schreibt B-Tree-Indizes auf ganzen Spalten; lege die anderen nach dem Laden neu an.

    Berichtszeile: index_skipped

  • foreign keys

    in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet

    SQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.

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

    nicht angelegt

    Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt, und einer, den Oracle nicht prüft, kann Zeilen ohne Elternzeile haben.

    Berichtszeile: foreign_key_skipped

  • partitioned tables

    eine Tabelle mit den Zeilen aller Partitionen

    Die Zeilen sind dieselben; partitioniere die Tabelle in SQLite neu, wenn nötig.

    Berichtszeile: partitions_dropped

  • several schemas in one export

    eine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestellt

    Eine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; ein Export eines einzelnen Schemas behält die Namen seiner Tabellen.

    Berichtszeile: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

    Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.

    Berichtszeile: not_null_relaxed

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

    im Bericht aufgeführt

    Ihr Code ist in PL/SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • exports without CREATE TABLE (data only)

    Typen aus den Werten gelesen

    Ein Export nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten; to_date, to_timestamp, TO_CLOB, HEXTORAW und die anderen, die Exporte schreiben, werden gelesen.

    Berichtszeile: expression_value

  • types IntoSQL doesn't know, and object types

    TEXT

    Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.

    Berichtszeile: unknown_type

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

    NULL

    Ein Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.

    Berichtszeile: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    Infinity als 9e999; NaN als NULL

    SQLite liest 9e999 als Unendlich zurück und kennt kein NaN.

  • NUL characters in text

    beibehalten

    Text in SQLite kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    Das Skript ist UTF-8, und jeder Wert muss gültiger Text sein.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

    Das Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.

    Berichtszeile: mojibake_suspected

In OracleIn SQLiteBerichtszeile
BOOLEAN (23ai)INTEGER 0 oder 1 mit einem CHECKSQLite hat keine boolesche Spalte, daher sind TRUE und FALSE 1 und 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGTEXTLängen zählen Zeichen, ob Oracle Bytes oder Zeichen gezählt hat, damit jeder Wert passt.
NUMBER, NUMBER(p,s), FLOAT(b)INTEGER oder NUMERIC, über 15 Stellen exakt als TextNUMBER behält jede Stelle; ein NUMBER ohne Genauigkeit, dessen Werte alle ganze Zahlen mit bis zu 18 Stellen sind, wird eine 64-Bit-Ganzzahl, und eine negative Skalierung fasst entsprechend viele Stellen vor dem Komma.decimal_as_text
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDTEXT mit dem Text von Oracle, etwa +01-06SQLite hat keinen interval-Typ; der Text behält jeden Teil.type_replaced
DATE, TIMESTAMP(p)DATETIME als ISO-8601-Text, jede Stelle erhaltenDATE in Oracle enthält eine Uhrzeit auf die Sekunde, daher ist es Datum und Uhrzeit. Ein Export in einer amerikanischen oder deutschen Sitzung schreibt Datumswerte ohne Uhrzeit und Jahrhundert (DD-MON-RR); exportiere in einer ISO-Sitzung (SYYYY-MM-DD HH24:MI:SS), um sie zu behalten.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP als ISO-8601-Text in UTCSQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz er auch hatte.moments_as_utc
JSON (21c), and CLOB holding JSONTEXTDieselben JSON-Werte; ein SQL-NULL, das der Export als 'null' geschrieben hat, bleibt NULL.
BLOB, RAW(n), LONG RAWBLOBBytes bleiben Bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYTEXTDie eigenen Typen von Oracle haben keine Entsprechung; ihre Werte behalten ihren Text, ROWID-Werte eingeschlossen, auch wenn sie außerhalb von Oracle nichts bedeuten.type_replaced
collations that ignore case (BINARY_CI)exakter VergleichSQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsINTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten IDDie kopierten IDs laden unverändert, und der Zähler macht nach der höchsten weiter. Eine Spalte, die ein Trigger aus einer Sequenz füllt (der Weg vor 12c), wird ebenfalls eine Identity-Spalte.
identity columns the target can't countINTEGER ohne ZählerSQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.counter_dropped
CREATE SEQUENCEnicht angelegtDer Export schreibt den Stand einer Sequenz als ihr START WITH, daher macht sie dort weiter.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)GENERATED ALWAYS AS, STORED bei PERSISTED, sonst VIRTUALSQLite berechnet sie aus derselben Formel; die Werte, die der Export für sie geschrieben hat, werden weggelassen.
virtual columns with functions IntoSQL doesn't write, and the || operatoreine normale SpalteEine Formel, die sich nicht für SQLite schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; die Werte, die der Export für virtuelle Spalten geschrieben hat, werden weggelassen, und SQLite kann sie nicht berechnen.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)kein StandardwertEin Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetztDieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.
CHECK constraints with functions IntoSQL doesn't writenicht angelegtEine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnicht angelegtOracle wendet diese CHECK-Bedingungen nicht auf die bereits vorhandenen Zeilen an, daher können die Zeilen sie verletzen.check_not_enforced
function-based, bitmap and domain indexesnicht angelegtIntoSQL schreibt B-Tree-Indizes auf ganzen Spalten; lege die anderen nach dem Laden neu an.index_skipped
foreign keysin CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistetSQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt, und einer, den Oracle nicht prüft, kann Zeilen ohne Elternzeile haben.foreign_key_skipped
partitioned tableseine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in SQLite neu, wenn nötig.partitions_dropped
several schemas in one exporteine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestelltEine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; ein Export eines einzelnen Schemas behält die Namen seiner Tabellen.schemas_merged
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersim Bericht aufgeführtIhr Code ist in PL/SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
exports without CREATE TABLE (data only)Typen aus den Werten gelesenEin Export nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
expressions in INSERT values other than the ones exports writeNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten; to_date, to_timestamp, TO_CLOB, HEXTORAW und die anderen, die Exporte schreiben, werden gelesen.expression_value
types IntoSQL doesn't know, and object typesTEXTText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
dates before year 1 and time zones given as region namesNULLEin Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLEInfinity als 9e999; NaN als NULLSQLite liest 9e999 als Unendlich zurück und kennt kein NaN.
NUL characters in textbeibehaltenText in SQLite kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.
text that isn't valid in its encodingdie fehlerhaften Bytes als ErsatzzeichenDas Skript ist UTF-8, und jeder Wert muss gültiger Text sein.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDas Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected

Das Skript in SQLite laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

sqlite3 -bail mydb.sqlite < oracle.sqlite.sql

Fremdschlüssel werden in jeder Tabelle deklariert, und die Zeilen laden mit ausgeschalteter Fremdschlüsselprüfung. Danach listet das Skript jede Zeile auf, die auf eine nicht vorhandene Zeile verweist, statt auf halbem Weg abzubrechen.

Lade einen großen Dump in eine neue Datei auf einer lokalen Festplatte. Das Skript lädt alles in einer Transaktion ohne Synchronisierung, so läuft es mit Festplattengeschwindigkeit, und ein abgebrochenes Laden hinterlässt keine halben Tabellen.

Die Kommandozeile lädt die Datei direkt in eine SQLite-Datenbank, ohne ein Skript zu schreiben. Das ist kostenlos.

Den Oracle-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

  • Wähle in SQL Developer Tools, Database Export, mit DDL und dem Datenformat Insert. SQLcl schreibt dasselbe mit SET SQLFORMAT INSERT.
  • Führe vor dem Export ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' aus: Das Standardformat schreibt Datumswerte ohne Uhrzeit und Jahrhundert.
  • Eine .dmp-Datei aus exp oder expdp ist binär: Importiere sie in eine Oracle-Datenbank, zum Beispiel Oracle Database Free in Docker, und exportiere sie mit SQL Developer.

Was nicht konvertiert wird

Sichten, Pakete, Prozeduren, Funktionen, Trigger, Typen und Synonyme sind in PL/SQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQLite neu schreiben kannst.

Fragen zu Oracle zu SQLite

Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite

Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

Kann ich eine .dmp-Datei aus exp oder expdp konvertieren?

Nicht direkt: Data Pump und das ursprüngliche Export-Werkzeug schreiben ein binäres Format, das nur Oracle liest. Importiere die Datei in eine beliebige Oracle-Datenbank (Oracle Database Free läuft in Docker) und exportiere sie mit Database Export in SQL Developer oder mit SQLcl. Der Konverter weist darauf hin, wenn er eine .dmp-Datei bekommt.

Aus welchen Oracle-Versionen kann der Export stammen?

Exporte aus SQL Developer und SQLcl, mit den Tabellendefinitionen von DBMS_METADATA, ab Oracle 11g. Jeder Test-Export stammt aus Oracle 21c und 23ai, in amerikanischen, deutschen und ISO-Sitzungen, und wird Zelle für Zelle mit seiner Quelle verglichen.

Was passiert mit NUMBER, DATE und den anderen Oracle-Typen?

NUMBER wird bei ganzen Zahlen INTEGER und behält sonst jede Stelle; DATE wird DATETIME-Text mit Uhrzeit; CLOB wird TEXT, BLOB und RAW BLOB. Infinity bleibt erhalten; NaN wird NULL.

Bleiben Identity-Spalten und Sequenzen erhalten?

Eine Identity-Spalte, die den ganzen Primärschlüssel der Tabelle bildet, wird INTEGER PRIMARY KEY AUTOINCREMENT und macht nach der höchsten ID weiter. SQLite hat keine Sequenzen, daher stehen sie im Bericht.

Was ist mit PL/SQL-Paketen, Prozeduren und Triggern?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.

Auf welchen SQLite-Versionen lädt das Skript?

SQLite 3.31 und neuer. Jeder Test-Export lädt auf 3.31 und 3.54 und hält beim ersten Fehler an, falls etwas schiefgeht.