Naar de inhoud
IntoSQL-startpagina

Oracle omzetten naar SQLite

Zet het .sql-bestand neer dat Database Export van SQL Developer of SQLcl schrijft, met zijn tabellen en Insert-statements, en download een SQLite-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQLite niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

Je bestand
sqlshop_2024_oracle.sqlVoorbeeldbestand, 9,3 kB
Je database

18 rijen geconverteerd, geen correcties, geen afgewezen

Tonen

Tabellen in shop_2024_oracle.sqlOracle-dump · geschreven door SQL Developer · utf-8

  • customers8 rijen
    7 kolommen
    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 rijen
    9 kolommen
    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;

Correcties

Er hoefde niets gecorrigeerd te worden.

Na te kijken

  • 1 sequence wordt niet aangemaakt; SQLite heeft geen sequences. Houd de volgende waarde bij in een tabel als je applicatie die nodig heeft.
  • De standaardwaarde van "invoice" in orders kan niet voor SQLite worden geschreven (a sequence), dus de kolom heeft geen standaardwaarde. Voeg de standaardwaarde met de hand toe als nieuwe rijen die nodig hebben.

Je bestand wordt op deze computer omgezet en nooit geüpload.

Andere voorbeelden:

Wat er verandert van Oracle naar SQLite

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

  • BOOLEAN (23ai)

    INTEGER 0 of 1 met een CHECK

    SQLite heeft geen boolean-kolom, dus TRUE en FALSE zijn 1 en 0.

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

    TEXT

    Lengtes tellen tekens, of Oracle nu bytes of tekens telde, zodat elke waarde past.

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

    INTEGER, of NUMERIC, boven 15 cijfers exact als tekst

    NUMBER behoudt elk cijfer; een NUMBER zonder precisie waarvan alle waarden gehele getallen van hoogstens 18 cijfers zijn, wordt een 64-bits integer, en een negatieve schaal krijgt evenveel cijfers voor de komma.

    Rapportregel: decimal_as_text

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    TEXT met de tekst van Oracle, zoals +01-06

    SQLite heeft geen interval-type; de tekst behoudt elk deel.

    Rapportregel: type_replaced

  • DATE, TIMESTAMP(p)

    DATETIME als ISO 8601-tekst, elk cijfer behouden

    DATE in Oracle bevat een tijd tot op de seconde, dus het is een datum met tijd. Een export in een Amerikaanse of Duitse sessie schrijft datums zonder tijd of eeuw (DD-MON-RR); exporteer in een ISO-sessie (SYYYY-MM-DD HH24:MI:SS) om ze te behouden.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    TIMESTAMP als ISO 8601-tekst in UTC

    SQLite heeft geen type dat een offset bewaart, dus elk moment wordt in UTC geschreven: hetzelfde moment, welke offset het ook had.

    Rapportregel: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    TEXT

    Dezelfde JSON-waarden; een SQL-NULL die de export als 'null' schreef, blijft NULL.

  • BLOB, RAW(n), LONG RAW

    BLOB

    Bytes blijven bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    TEXT

    De eigen typen van Oracle hebben geen equivalent; hun waarden behouden hun tekst, ROWID-waarden inbegrepen, al betekenen die buiten Oracle niets.

    Rapportregel: type_replaced

  • collations that ignore case (BINARY_CI)

    exacte vergelijking

    SQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.

    Rapportregel: case_insensitive_collation

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

    INTEGER PRIMARY KEY AUTOINCREMENT, verdergaand na het hoogste id

    De gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste. Een kolom die een trigger vult uit een sequence (de manier van voor 12c) wordt ook een identity-kolom.

  • identity columns the target can't count

    INTEGER zonder teller

    SQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig.

    Rapportregel: counter_dropped

  • CREATE SEQUENCE

    niet aangemaakt

    De export schrijft hoe ver een sequence is gekomen als zijn START WITH, dus hij gaat daar verder.

    Rapportregel: sequence_not_converted

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

    GENERATED ALWAYS AS, STORED bij PERSISTED, anders VIRTUAL

    SQLite berekent ze met dezelfde formule; de waarden die de export ervoor schreef, worden weggelaten.

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

    een gewone kolom

    Een formule die niet voor SQLite kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de waarden die de export voor virtuele kolommen schreef, worden weggelaten, en SQLite kan ze niet berekenen.

    Rapportregel: generated_not_translated

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

    geen standaardwaarde

    Een standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: default_not_translated

  • CHECK constraints

    vertaald

    Dezelfde checks, getest terwijl elke rij laadt.

  • CHECK constraints with functions IntoSQL doesn't write

    niet aangemaakt

    Een check die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    niet aangemaakt

    Oracle past deze checks niet toe op de rijen die er al zijn, dus de rijen kunnen ze schenden.

    Rapportregel: check_not_enforced

  • function-based, bitmap and domain indexes

    niet aangemaakt

    IntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.

    Rapportregel: index_skipped

  • foreign keys

    in CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_check

    SQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd en het script somt aan het einde elke rij zonder ouder op.

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

    niet aangemaakt

    Een sleutel kan niet verwijzen naar een tabel die er niet is, en een sleutel die Oracle niet controleert, kan rijen zonder ouder hebben.

    Rapportregel: foreign_key_skipped

  • partitioned tables

    één tabel met de rijen van elke partitie

    De rijen zijn dezelfde; partitioneer de tabel opnieuw in SQLite als dat nodig is.

    Rapportregel: partitions_dropped

  • several schemas in one export

    één bestand, tabellen met de naam van hun schema ervoor

    Een SQLite-bestand is één database, dus de schemanaam houdt tabellen met dezelfde naam uit elkaar; een export van één schema behoudt de namen van zijn tabellen.

    Rapportregel: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL weggelaten

    Een kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.

    Rapportregel: not_null_relaxed

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

    vermeld in het rapport

    Hun code is geschreven in PL/SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.

    Rapportregel: not_converted_objects

  • exports without CREATE TABLE (data only)

    typen afgeleid uit de waarden

    Een export met alleen data bevat alleen rijen, dus de typen komen uit de waarden.

    Rapportregel: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Een converter die geen database draait, kan ze niet evalueren; to_date, to_timestamp, TO_CLOB, HEXTORAW en de andere die exports schrijven, worden gelezen.

    Rapportregel: expression_value

  • types IntoSQL doesn't know, and object types

    TEXT

    Text kan elke waarde bevatten; wijzig het type na het laden.

    Rapportregel: unknown_type

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

    NULL

    Een waarde die geen datum is, wordt NULL en het rapport telt hem.

    Rapportregel: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    Infinity als 9e999; NaN als NULL

    SQLite leest 9e999 terug als oneindig en kent geen NaN.

  • NUL characters in text

    behouden

    Tekst in SQLite kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.

  • text that isn't valid in its encoding

    de foute bytes als het vervangingsteken

    Het script is UTF-8 en elke waarde moet geldige tekst zijn.

    Rapportregel: invalid_utf8_replaced

  • text decoded twice (ñ)

    ongewijzigd gekopieerd

    Het script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.

    Rapportregel: mojibake_suspected

In OracleIn SQLiteRapportregel
BOOLEAN (23ai)INTEGER 0 of 1 met een CHECKSQLite heeft geen boolean-kolom, dus TRUE en FALSE zijn 1 en 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGTEXTLengtes tellen tekens, of Oracle nu bytes of tekens telde, zodat elke waarde past.
NUMBER, NUMBER(p,s), FLOAT(b)INTEGER, of NUMERIC, boven 15 cijfers exact als tekstNUMBER behoudt elk cijfer; een NUMBER zonder precisie waarvan alle waarden gehele getallen van hoogstens 18 cijfers zijn, wordt een 64-bits integer, en een negatieve schaal krijgt evenveel cijfers voor de komma.decimal_as_text
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDTEXT met de tekst van Oracle, zoals +01-06SQLite heeft geen interval-type; de tekst behoudt elk deel.type_replaced
DATE, TIMESTAMP(p)DATETIME als ISO 8601-tekst, elk cijfer behoudenDATE in Oracle bevat een tijd tot op de seconde, dus het is een datum met tijd. Een export in een Amerikaanse of Duitse sessie schrijft datums zonder tijd of eeuw (DD-MON-RR); exporteer in een ISO-sessie (SYYYY-MM-DD HH24:MI:SS) om ze te behouden.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP als ISO 8601-tekst in UTCSQLite heeft geen type dat een offset bewaart, dus elk moment wordt in UTC geschreven: hetzelfde moment, welke offset het ook had.moments_as_utc
JSON (21c), and CLOB holding JSONTEXTDezelfde JSON-waarden; een SQL-NULL die de export als 'null' schreef, blijft NULL.
BLOB, RAW(n), LONG RAWBLOBBytes blijven bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYTEXTDe eigen typen van Oracle hebben geen equivalent; hun waarden behouden hun tekst, ROWID-waarden inbegrepen, al betekenen die buiten Oracle niets.type_replaced
collations that ignore case (BINARY_CI)exacte vergelijkingSQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsINTEGER PRIMARY KEY AUTOINCREMENT, verdergaand na het hoogste idDe gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste. Een kolom die een trigger vult uit een sequence (de manier van voor 12c) wordt ook een identity-kolom.
identity columns the target can't countINTEGER zonder tellerSQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig.counter_dropped
CREATE SEQUENCEniet aangemaaktDe export schrijft hoe ver een sequence is gekomen als zijn START WITH, dus hij gaat daar verder.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)GENERATED ALWAYS AS, STORED bij PERSISTED, anders VIRTUALSQLite berekent ze met dezelfde formule; de waarden die de export ervoor schreef, worden weggelaten.
virtual columns with functions IntoSQL doesn't write, and the || operatoreen gewone kolomEen formule die niet voor SQLite kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de waarden die de export voor virtuele kolommen schreef, worden weggelaten, en SQLite kan ze niet berekenen.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)geen standaardwaardeEen standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
CHECK constraintsvertaaldDezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions IntoSQL doesn't writeniet aangemaaktEen check die niet kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEniet aangemaaktOracle past deze checks niet toe op de rijen die er al zijn, dus de rijen kunnen ze schenden.check_not_enforced
function-based, bitmap and domain indexesniet aangemaaktIntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.index_skipped
foreign keysin CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_checkSQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd en het script somt aan het einde elke rij zonder ouder op.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesniet aangemaaktEen sleutel kan niet verwijzen naar een tabel die er niet is, en een sleutel die Oracle niet controleert, kan rijen zonder ouder hebben.foreign_key_skipped
partitioned tableséén tabel met de rijen van elke partitieDe rijen zijn dezelfde; partitioneer de tabel opnieuw in SQLite als dat nodig is.partitions_dropped
several schemas in one exportéén bestand, tabellen met de naam van hun schema ervoorEen SQLite-bestand is één database, dus de schemanaam houdt tabellen met dezelfde naam uit elkaar; een export van één schema behoudt de namen van zijn tabellen.schemas_merged
NOT NULL columns with values that become NULLNOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersvermeld in het rapportHun code is geschreven in PL/SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.not_converted_objects
exports without CREATE TABLE (data only)typen afgeleid uit de waardenEen export met alleen data bevat alleen rijen, dus de typen komen uit de waarden.no_schema
expressions in INSERT values other than the ones exports writeNULLEen converter die geen database draait, kan ze niet evalueren; to_date, to_timestamp, TO_CLOB, HEXTORAW en de andere die exports schrijven, worden gelezen.expression_value
types IntoSQL doesn't know, and object typesTEXTText kan elke waarde bevatten; wijzig het type na het laden.unknown_type
dates before year 1 and time zones given as region namesNULLEen waarde die geen datum is, wordt NULL en het rapport telt hem.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLEInfinity als 9e999; NaN als NULLSQLite leest 9e999 terug als oneindig en kent geen NaN.
NUL characters in textbehoudenTekst in SQLite kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its encodingde foute bytes als het vervangingstekenHet script is UTF-8 en elke waarde moet geldige tekst zijn.invalid_utf8_replaced
text decoded twice (ñ)ongewijzigd gekopieerdHet script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.mojibake_suspected

Het script in SQLite laden

Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.

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

Refererende sleutels worden in elke tabel gedeclareerd en de rijen laden met de controle op refererende sleutels uit. Daarna somt het script elke rij op die naar een niet-bestaande rij verwijst, in plaats van halverwege te mislukken.

Laad een grote dump in een nieuw bestand op een lokale schijf. Het script laadt alles in één transactie met synchronisatie uit, dus het draait op schijfsnelheid, en een laadactie die halverwege stopt, laat geen halve tabellen achter.

De opdrachtregel laadt het bestand rechtstreeks in een SQLite-database, zonder een script te schrijven. Dat is gratis.

Een dump van Oracle maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

  • Kies in SQL Developer Tools, Database Export, met DDL en het dataformaat Insert. SQLcl schrijft hetzelfde met SET SQLFORMAT INSERT.
  • Voer ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' uit voordat je exporteert: het standaardformaat schrijft datums zonder tijd of eeuw.
  • Een .dmp-bestand van exp of expdp is binair: importeer het in een Oracle-database, bijvoorbeeld Oracle Database Free in Docker, en exporteer het met SQL Developer.

Wat niet wordt geconverteerd

Weergaven, packages, procedures, functies, triggers, typen en synoniemen zijn geschreven in PL/SQL. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQLite.

Vragen over Oracle naar SQLite

Staat je vraag er niet bij? Schrijf ons via de contactpagina en een mens antwoordt. Contactpagina

Wordt mijn dump geüpload?

Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.

Hoe groot mag de dump zijn?

De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.

Kan ik een .dmp-bestand van exp of expdp converteren?

Niet direct: Data Pump en de oorspronkelijke Export schrijven een binair formaat dat alleen Oracle leest. Importeer het bestand in een willekeurige Oracle-database (Oracle Database Free draait in Docker) en exporteer het met Database Export van SQL Developer of met SQLcl. De converter meldt dat wanneer hij een .dmp-bestand krijgt.

Van welke Oracle-versies kan de export komen?

Exports uit SQL Developer en SQLcl, met de tabeldefinities van DBMS_METADATA, vanaf Oracle 11g. Elke testexport komt van Oracle 21c en 23ai, in Amerikaanse, Duitse en ISO-sessies, en wordt cel voor cel met zijn bron vergeleken.

Wat gebeurt er met NUMBER, DATE en de andere Oracle-typen?

NUMBER wordt INTEGER voor gehele getallen en behoudt anders elk cijfer; DATE wordt DATETIME-tekst met zijn tijd; CLOB wordt TEXT, BLOB en RAW BLOB. Infinity blijft behouden; NaN wordt NULL.

Blijven identity-kolommen en sequences behouden?

Een identity-kolom die de hele primaire sleutel van de tabel is, wordt INTEGER PRIMARY KEY AUTOINCREMENT en gaat verder na het hoogste id. SQLite heeft geen sequences, dus die worden gemeld.

En PL/SQL-packages, procedures en triggers?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.

Op welke SQLite-versies laadt het script?

SQLite 3.31 en later. Elke testexport laadt op 3.31 en 3.54 en stopt bij de eerste fout als er iets misgaat.