Aller au contenu
Accueil IntoSQL

Convertir Oracle en SQLite

Déposez le fichier .sql qu'écrit Database Export de SQL Developer ou SQLcl, avec ses tables et ses instructions Insert, et téléchargez un script SQLite avec les mêmes tables, clés, index et données. Chaque valeur que SQLite ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

Votre fichier
sqlshop_2024_oracle.sqlFichier d'exemple, 9,3 ko
Votre base de données

18 lignes converties, aucune correction, aucune rejetée

Afficher

Tables de shop_2024_oracle.sqlDump Oracle · écrit par SQL Developer · utf-8

  • customers8 lignes
    7 colonnes
    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 lignes
    9 colonnes
    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;

Corrections

Rien n'avait besoin d'être corrigé.

À vérifier

  • 1 séquence non créée ; SQLite n'a pas de séquences. Gardez la prochaine valeur dans une table si votre application en a besoin.
  • La valeur par défaut de "invoice" dans orders ne peut pas être écrite pour SQLite (a sequence) ; la colonne n'a donc pas de valeur par défaut. Ajoutez la valeur par défaut à la main si les nouvelles lignes en ont besoin.

Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.

Autres exemples :

Ce qui change de Oracle à SQLite

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

  • BOOLEAN (23ai)

    INTEGER 0 ou 1 avec un CHECK

    SQLite n'a pas de colonne booléenne ; TRUE et FALSE deviennent donc 1 et 0.

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

    TEXT

    Les longueurs comptent les caractères, qu'Oracle ait compté des octets ou des caractères, donc chaque valeur tient.

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

    INTEGER, ou NUMERIC gardé exact en texte au-delà de 15 chiffres

    NUMBER garde chaque chiffre ; un NUMBER sans précision dont toutes les valeurs sont des nombres entiers de 18 chiffres au plus est un entier 64 bits, et une échelle négative garde autant de chiffres avant la virgule.

    Ligne du rapport: decimal_as_text

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    TEXT avec le texte d'Oracle, comme +01-06

    SQLite n'a pas de type intervalle ; le texte en garde chaque partie.

    Ligne du rapport: type_replaced

  • DATE, TIMESTAMP(p)

    DATETIME en texte ISO 8601, chaque chiffre gardé

    Le DATE d'Oracle contient une heure à la seconde près ; c'est donc une date et une heure. Un export dans une session américaine ou allemande écrit les dates sans leur heure ni leur siècle (DD-MON-RR) ; exportez dans une session ISO (SYYYY-MM-DD HH24:MI:SS) pour les garder.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    TIMESTAMP en texte ISO 8601 en UTC

    SQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit son décalage.

    Ligne du rapport: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    TEXT

    Les mêmes valeurs JSON ; un NULL SQL que l'export a écrit 'null' reste NULL.

  • BLOB, RAW(n), LONG RAW

    BLOB

    Les octets restent des octets.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    TEXT

    Les types propres à Oracle n'ont pas d'équivalent ; leurs valeurs gardent leur texte, valeurs ROWID comprises, même si elles n'ont aucun sens hors d'Oracle.

    Ligne du rapport: type_replaced

  • collations that ignore case (BINARY_CI)

    comparaison exacte

    SQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII.

    Ligne du rapport: case_insensitive_collation

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

    INTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevé

    Les identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé. Une colonne qu'un déclencheur remplit depuis une séquence (la méthode d'avant 12c) devient aussi une colonne d'identité.

  • identity columns the target can't count

    INTEGER sans compteur

    SQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs.

    Ligne du rapport: counter_dropped

  • CREATE SEQUENCE

    non créée

    L'export écrit où en est une séquence comme son START WITH ; elle reprend donc à partir de là.

    Ligne du rapport: sequence_not_converted

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

    GENERATED ALWAYS AS, STORED si PERSISTED, VIRTUAL sinon

    SQLite les calcule à partir de la même formule ; les valeurs que l'export a écrites pour elles sont omises.

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

    une colonne simple

    Une formule qui ne peut pas être écrite pour SQLite laisse une colonne simple et une ligne dans le rapport ; les valeurs que l'export a écrites pour les colonnes virtuelles sont omises, et SQLite ne peut pas les calculer.

    Ligne du rapport: generated_not_translated

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

    aucune valeur par défaut

    Une valeur par défaut qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: default_not_translated

  • CHECK constraints

    traduites

    Les mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.

  • CHECK constraints with functions IntoSQL doesn't write

    non créée

    Une contrainte CHECK qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    non créée

    Oracle n'applique pas ces contraintes CHECK aux lignes déjà présentes, qui peuvent donc les enfreindre.

    Ligne du rapport: check_not_enforced

  • function-based, bitmap and domain indexes

    non créée

    IntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.

    Ligne du rapport: index_skipped

  • foreign keys

    dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_check

    SQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent.

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

    non créée

    Une clé ne peut pas désigner une table absente, et une clé qu'Oracle ne vérifie pas peut avoir des lignes sans parent.

    Ligne du rapport: foreign_key_skipped

  • partitioned tables

    une seule table avec les lignes de chaque partition

    Les lignes sont les mêmes ; partitionnez à nouveau la table dans SQLite si besoin.

    Ligne du rapport: partitions_dropped

  • several schemas in one export

    un seul fichier, tables préfixées par le nom de leur schéma

    Un fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et un export d'un seul schéma garde le nom de ses tables.

    Ligne du rapport: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL retiré

    Une colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.

    Ligne du rapport: not_null_relaxed

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

    listés dans le rapport

    Leur code est écrit en PL/SQL ; ils sont donc listés pour que vous les recréiez.

    Ligne du rapport: not_converted_objects

  • exports without CREATE TABLE (data only)

    types déduits des valeurs

    Un export de données seules ne contient que des lignes, donc les types viennent des valeurs.

    Ligne du rapport: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer ; to_date, to_timestamp, TO_CLOB, HEXTORAW et les autres que les exports écrivent sont lus.

    Ligne du rapport: expression_value

  • types IntoSQL doesn't know, and object types

    TEXT

    Le texte contient n'importe quelle valeur ; changez le type après le chargement.

    Ligne du rapport: unknown_type

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

    NULL

    Une valeur qui n'est pas une date devient NULL et le rapport la compte.

    Ligne du rapport: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    Infinity en 9e999 ; NaN en NULL

    SQLite relit 9e999 comme l'infini et n'a pas de NaN.

  • NUL characters in text

    conservé

    Le texte SQLite peut contenir un caractère NUL, donc la valeur est copiée telle quelle.

  • text that isn't valid in its encoding

    les octets invalides deviennent le caractère de remplacement

    Le script est en UTF-8 et chaque valeur doit être du texte valide.

    Ligne du rapport: invalid_utf8_replaced

  • text decoded twice (ñ)

    copié tel quel

    Le script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.

    Ligne du rapport: mojibake_suspected

Dans OracleDans SQLiteLigne du rapport
BOOLEAN (23ai)INTEGER 0 ou 1 avec un CHECKSQLite n'a pas de colonne booléenne ; TRUE et FALSE deviennent donc 1 et 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGTEXTLes longueurs comptent les caractères, qu'Oracle ait compté des octets ou des caractères, donc chaque valeur tient.
NUMBER, NUMBER(p,s), FLOAT(b)INTEGER, ou NUMERIC gardé exact en texte au-delà de 15 chiffresNUMBER garde chaque chiffre ; un NUMBER sans précision dont toutes les valeurs sont des nombres entiers de 18 chiffres au plus est un entier 64 bits, et une échelle négative garde autant de chiffres avant la virgule.decimal_as_text
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDTEXT avec le texte d'Oracle, comme +01-06SQLite n'a pas de type intervalle ; le texte en garde chaque partie.type_replaced
DATE, TIMESTAMP(p)DATETIME en texte ISO 8601, chaque chiffre gardéLe DATE d'Oracle contient une heure à la seconde près ; c'est donc une date et une heure. Un export dans une session américaine ou allemande écrit les dates sans leur heure ni leur siècle (DD-MON-RR) ; exportez dans une session ISO (SYYYY-MM-DD HH24:MI:SS) pour les garder.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP en texte ISO 8601 en UTCSQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit son décalage.moments_as_utc
JSON (21c), and CLOB holding JSONTEXTLes mêmes valeurs JSON ; un NULL SQL que l'export a écrit 'null' reste NULL.
BLOB, RAW(n), LONG RAWBLOBLes octets restent des octets.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYTEXTLes types propres à Oracle n'ont pas d'équivalent ; leurs valeurs gardent leur texte, valeurs ROWID comprises, même si elles n'ont aucun sens hors d'Oracle.type_replaced
collations that ignore case (BINARY_CI)comparaison exacteSQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsINTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevéLes identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé. Une colonne qu'un déclencheur remplit depuis une séquence (la méthode d'avant 12c) devient aussi une colonne d'identité.
identity columns the target can't countINTEGER sans compteurSQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs.counter_dropped
CREATE SEQUENCEnon crééeL'export écrit où en est une séquence comme son START WITH ; elle reprend donc à partir de là.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)GENERATED ALWAYS AS, STORED si PERSISTED, VIRTUAL sinonSQLite les calcule à partir de la même formule ; les valeurs que l'export a écrites pour elles sont omises.
virtual columns with functions IntoSQL doesn't write, and the || operatorune colonne simpleUne formule qui ne peut pas être écrite pour SQLite laisse une colonne simple et une ligne dans le rapport ; les valeurs que l'export a écrites pour les colonnes virtuelles sont omises, et SQLite ne peut pas les calculer.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)aucune valeur par défautUne valeur par défaut qui ne peut pas être écrite est omise et signalée.default_not_translated
CHECK constraintstraduitesLes mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.
CHECK constraints with functions IntoSQL doesn't writenon crééeUne contrainte CHECK qui ne peut pas être écrite est omise et signalée.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnon crééeOracle n'applique pas ces contraintes CHECK aux lignes déjà présentes, qui peuvent donc les enfreindre.check_not_enforced
function-based, bitmap and domain indexesnon crééeIntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.index_skipped
foreign keysdans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_checkSQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnon crééeUne clé ne peut pas désigner une table absente, et une clé qu'Oracle ne vérifie pas peut avoir des lignes sans parent.foreign_key_skipped
partitioned tablesune seule table avec les lignes de chaque partitionLes lignes sont les mêmes ; partitionnez à nouveau la table dans SQLite si besoin.partitions_dropped
several schemas in one exportun seul fichier, tables préfixées par le nom de leur schémaUn fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et un export d'un seul schéma garde le nom de ses tables.schemas_merged
NOT NULL columns with values that become NULLNOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistés dans le rapportLeur code est écrit en PL/SQL ; ils sont donc listés pour que vous les recréiez.not_converted_objects
exports without CREATE TABLE (data only)types déduits des valeursUn export de données seules ne contient que des lignes, donc les types viennent des valeurs.no_schema
expressions in INSERT values other than the ones exports writeNULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer ; to_date, to_timestamp, TO_CLOB, HEXTORAW et les autres que les exports écrivent sont lus.expression_value
types IntoSQL doesn't know, and object typesTEXTLe texte contient n'importe quelle valeur ; changez le type après le chargement.unknown_type
dates before year 1 and time zones given as region namesNULLUne valeur qui n'est pas une date devient NULL et le rapport la compte.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLEInfinity en 9e999 ; NaN en NULLSQLite relit 9e999 comme l'infini et n'a pas de NaN.
NUL characters in textconservéLe texte SQLite peut contenir un caractère NUL, donc la valeur est copiée telle quelle.
text that isn't valid in its encodingles octets invalides deviennent le caractère de remplacementLe script est en UTF-8 et chaque valeur doit être du texte valide.invalid_utf8_replaced
text decoded twice (ñ)copié tel quelLe script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.mojibake_suspected

Charger le script dans SQLite

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

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

Les clés étrangères sont déclarées dans chaque table et les lignes se chargent sans vérification des clés étrangères. Le script liste ensuite toute ligne qui pointe vers une ligne qui n'existe pas, au lieu d'échouer à mi-chemin.

Pour un gros dump, chargez-le dans un nouveau fichier sur un disque local. Le script charge tout dans une seule transaction sans synchronisation, il va donc à la vitesse du disque, et un chargement interrompu ne laisse aucune table partielle.

La ligne de commande charge le fichier directement dans une base SQLite, sans écrire de script. C'est gratuit.

Faire le dump Oracle pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

  • Dans SQL Developer, choisissez Tools, Database Export, avec DDL et le format de données Insert. SQLcl écrit la même chose avec SET SQLFORMAT INSERT.
  • Exécutez ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' avant l'export : le format par défaut écrit les dates sans leur heure ni leur siècle.
  • Un fichier .dmp de exp ou expdp est binaire : importez-le dans une base Oracle, par exemple Oracle Database Free dans Docker, et exportez-le avec SQL Developer.

Ce qui n'est pas converti

Les vues, packages, procédures, fonctions, déclencheurs, types et synonymes sont écrits en PL/SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQLite.

Questions sur Oracle vers SQLite

Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact

Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

Puis-je convertir un fichier .dmp de exp ou expdp ?

Pas directement : Data Pump et l'Export d'origine écrivent un format binaire que seul Oracle lit. Importez-le dans n'importe quelle base Oracle, Oracle Database Free tourne dans Docker, et exportez-le avec Database Export de SQL Developer ou SQLcl. Le convertisseur le signale quand il reçoit un fichier .dmp.

De quelles versions de Oracle l'export peut-il venir ?

Les exports de SQL Developer et SQLcl, avec les définitions de tables de DBMS_METADATA, depuis Oracle 11g. Chaque export de test vient de Oracle 21c et 23ai, dans des sessions américaine, allemande et ISO, et est comparé à sa source cellule par cellule.

Que deviennent NUMBER, DATE et les autres types Oracle ?

NUMBER devient INTEGER pour les nombres entiers et garde chaque chiffre sinon ; DATE devient du texte DATETIME avec son heure ; CLOB TEXT, BLOB et RAW BLOB. Infinity est conservé ; NaN devient NULL.

Les colonnes d'identité et les séquences sont-elles gardées ?

Une colonne d'identité qui forme toute la clé primaire de la table devient INTEGER PRIMARY KEY AUTOINCREMENT et reprend après l'identifiant le plus élevé. SQLite n'a pas de séquences ; elles sont donc signalées.

Et les packages, procédures et déclencheurs PL/SQL ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

Sur quelles versions de SQLite le script se charge-t-il ?

SQLite 3.31 et versions ultérieures. Chaque export de test se charge sur 3.31 et 3.54, et s'arrête à la première erreur en cas de problème.