Aller au contenu
Accueil IntoSQL

Convertir MySQL en Oracle

Déposez un dump de mysqldump, mariadb-dump, mysqlpump, phpMyAdmin ou Adminer, en .sql ou .sql.gz, et téléchargez un script Oracle avec les mêmes tables, clés, index et données. Chaque valeur que Oracle ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

Votre fichier
sqlshop_2024.sqlFichier d'exemple, 5,1 ko
Votre base de données

18 lignes converties, 4 corrections, aucune rejetée

Afficher

Tables de shop_2024.sqlDump MySQL 8.0.46 · écrit par mysqldump · utf8mb4

  • customersécrite sous le nom CUSTOMERS8 lignes2
    7 colonnes
    IDNUMBER(10) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(150 CHAR) not null
    COUNTRYVARCHAR2(2 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) WITH TIME ZONE not null
  • ordersécrite sous le nom ORDERS10 lignes2
    9 colonnes
    IDNUMBER(10) not null
    CUSTOMER_IDNUMBER(10) not null
    STATUSVARCHAR2(9 CHAR)
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(5) not null
    ORDERED_ATTIMESTAMP(0) not null
    SHIPPED_ATTIMESTAMP(0)
    NOTEVARCHAR2(255 CHAR)
    UPDATED_ATTIMESTAMP(0) WITH TIME ZONE not null
-- Written by IntoSQL from a MySQL dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
    r CLOB;
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        IF p(i) IS NOT NULL THEN
            DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
        END IF;
    END LOOP;
    RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
    r BLOB;
    piece RAW(2000);
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        piece := HEXTORAW(p(i));
        DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
    END LOOP;
    RETURN r;
END;
/

CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1001),
    "NAME" VARCHAR2(100 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(150 CHAR) NOT NULL,
    "COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
    CONSTRAINT "CK_CUSTOMERS_ID" CHECK ("ID" >= 0),
    CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);

CREATE TABLE "ORDERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 5001),
    "CUSTOMER_ID" NUMBER(10) NOT NULL,
    "STATUS" VARCHAR2(9 CHAR) DEFAULT 'pending',
    "TOTAL" NUMBER(10,2) NOT NULL,
    "ITEMS" NUMBER(5) DEFAULT 1 NOT NULL,
    "ORDERED_AT" TIMESTAMP(0) NOT NULL,
    "SHIPPED_AT" TIMESTAMP(0),
    "NOTE" VARCHAR2(255 CHAR),
    "UPDATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
    CONSTRAINT "CK_ORDERS_ID" CHECK ("ID" >= 0),
    CONSTRAINT "CK_ORDERS_CUSTOMER_ID" CHECK ("CUSTOMER_ID" >= 0),
    CONSTRAINT "CK_ORDERS_STATUS" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT "CK_ORDERS_ITEMS" CHECK ("ITEMS" >= 0)
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
TIMESTAMP '2024-03-02 16:30:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
TIMESTAMP '2024-03-02 11:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
TIMESTAMP '2024-03-03 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
TIMESTAMP '2024-03-07 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
TIMESTAMP '2024-03-08 17:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
6,
6,
'shipped',
310.40,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"',
TIMESTAMP '2024-03-11 09:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
TIMESTAMP '2024-03-11 18:46:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
8,
2,
NULL,
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Status lost in an old import',
TIMESTAMP '2024-03-12 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
TIMESTAMP '2024-03-15 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"UPDATED_AT"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
TIMESTAMP '2024-03-15 21:05:00 +00:00'
);
COMMIT;
END;
/

-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_UQ_EMAIL" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_IDX_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "FK_ORDERS_CUSTOMER" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS_CUSTOMER"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS_CUSTOMER"' || ' has rows without a parent: it stays unvalidated, and new rows are checked.');
END;
/
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "CUSTOMERS";
    IF next_id < 1001 THEN
        next_id := 1001;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
COMMENT ON TABLE "CUSTOMERS" IS 'People who bought at least once';
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
    IF next_id < 5001 THEN
        next_id := 5001;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
CREATE OR REPLACE TRIGGER "TR_ORDERS_UPDATED_AT" BEFORE UPDATE ON "ORDERS" FOR EACH ROW
BEGIN
    IF NOT UPDATING('UPDATED_AT') THEN
        :NEW."UPDATED_AT" := SYSTIMESTAMP;
    END IF;
END;
/
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;

Corrections

  1. "signed_up" de customers accepte maintenant NULL : certaines de ses valeurs ne pouvaient pas être stockées et sont NULL.
  2. La valeur par défaut de "signed_up" dans customers, 0000‑00‑00, n'est pas une date acceptée par Oracle ; la colonne n'a donc pas de valeur par défaut.
  3. "status" de orders accepte maintenant NULL : certaines de ses valeurs ne pouvaient pas être stockées et sont NULL.
  4. "updated_at" de orders passe à l'heure actuelle à chaque mise à jour ; dans Oracle, un déclencheur s'en charge.

À vérifier

  • 1 valeur dans "signed_up" de customers est une date zéro ou impossible, comme 0000‑00‑00, que Oracle ne peut pas stocker ; elle est donc NULL. Si ces dates ont un sens, remplacez-les dans la source par de vraies dates avant le dump.
  • 1 valeur dans "shipped_at" de orders est une date zéro ou impossible, comme 0000‑00‑00 00:00:00, que Oracle ne peut pas stocker ; elle est donc NULL. Si ces dates ont un sens, remplacez-les dans la source par de vraies dates avant le dump.
  • 1 valeur vide dans "status" de orders est devenue NULL ; Oracle stocke une chaîne vide comme NULL. Là où des requêtes comparent cette colonne avec ', comparez plutôt avec IS NULL.

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

Autres exemples :

Ce qui change de MySQL à Oracle

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.

  • TINYINT(1), BOOL

    NUMBER(1) avec un CHECK de 0 et 1 si chaque valeur vaut 0 ou 1, sinon NUMBER(3)

    Le BOOL de MySQL est un TINYINT(1) qui peut contenir tout nombre de -128 à 127. Oracle avant 23ai n'a pas de colonne booléenne, donc une colonne de 0 et 1 devient NUMBER(1) avec un CHECK ; une colonne qui contient 2 ou -1 garde ses nombres.

    Ligne du rapport: bool_kept_numeric

  • UNSIGNED integers

    NUMBER assez large pour la plage, avec un CHECK qui interdit les négatifs

    Le NUMBER d'Oracle contient tout entier des largeurs de MySQL ; la contrainte CHECK écarte les valeurs négatives comme le faisait MySQL.

  • ZEROFILL and display widths

    supprimé

    Le remplissage par des zéros est une façon d'afficher un nombre, pas une partie du nombre. Les nombres sont conservés ; formatez-les à la lecture si le remplissage compte.

    Ligne du rapport: zerofill_dropped

  • FLOAT(M,D)

    BINARY_FLOAT ou BINARY_DOUBLE, sans l'échelle

    Les flottants binaires d'Oracle n'ont pas d'échelle fixe. Les valeurs stockées sont copiées telles quelles.

    Ligne du rapport: float_scale_dropped

  • DECIMAL(p,s)

    NUMBER(p,s) jusqu'à 38 chiffres ; VARCHAR2 au-delà

    Le NUMBER d'Oracle contient 38 chiffres. Les décimaux plus larges sont gardés en texte pour que chaque chiffre reste exact.

    Ligne du rapport: decimal_as_text

  • BIT(1), BIT(n)

    NUMBER(1), NUMBER(19) jusqu'à 63 bits, NUMBER(20) pour BIT(64)

    Les champs de bits sont stockés comme le nombre que forment leurs bits.

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    Oracle ne stocke que de vraies dates du calendrier. MySQL garde les dates zéro et impossibles quand son mode SQL les autorise ; elles deviennent NULL et le rapport les compte.

    Ligne du rapport: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL retiré

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

    Ligne du rapport: not_null_relaxed

  • empty strings and empty binary values

    NULL

    Oracle stocke une chaîne vide comme NULL, donc une valeur qui valait ' se relit comme NULL. Le rapport les compte par colonne.

    Ligne du rapport: empty_string_null

  • DEFAULT '0000-00-00'

    aucune valeur par défaut

    Une valeur par défaut qu'Oracle ne peut pas stocker est omise plutôt que remplacée par une date inventée.

    Ligne du rapport: zero_date_default

  • TIME

    INTERVAL DAY TO SECOND, qui contient des durées

    Oracle n'a pas de type heure du jour, et le TIME de MySQL est une durée de -838:59:59 à 838:59:59 ; un intervalle contient chaque valeur.

  • YEAR

    NUMBER(4) avec un CHECK de sa plage

    Oracle n'a pas de type année ; le CHECK garde les mêmes valeurs que MySQL autorise.

  • CHAR(n), VARCHAR(n)

    VARCHAR2(n CHAR), en caractères

    Les longueurs comptent les caractères comme celles de MySQL, et MySQL renvoie les valeurs CHAR sans espaces de fin, telles que VARCHAR2 les garde.

  • VARCHAR(n) and TEXT longer than 4000 bytes

    CLOB

    Un VARCHAR2 contient 4000 octets par défaut, donc un texte plus long devient un CLOB ; une colonne dont toutes les valeurs tiennent garde VARCHAR2.

    Ligne du rapport: text_as_lob

  • DATETIME

    TIMESTAMP

    Un DATETIME est une date et une heure locales, sans fuseau horaire, comme TIMESTAMP. DATE devient le DATE d'Oracle, qui contient aussi une heure du jour, laissée à minuit.

  • TIMESTAMP

    TIMESTAMP WITH TIME ZONE dans le fuseau indiqué par le dump, UTC s'il n'en indique aucun

    Un TIMESTAMP est un instant. Les dumps indiquent le fuseau dans lequel ils l'ont écrit (mysqldump écrit en UTC) ; sinon, les valeurs sont lues en UTC et le rapport le signale.

    Ligne du rapport: timestamp_zone_assumed

  • ENUM

    VARCHAR2 avec un CHECK de ses valeurs

    Un texte avec une contrainte CHECK garde les mêmes valeurs.

  • ENUM holding '' (MySQL's error value)

    NULL

    MySQL stocke une chaîne vide quand une valeur invalide entre dans un ENUM avec un mode SQL permissif. Oracle la stocke comme NULL, ce que la contrainte CHECK autorise, et le rapport la compte avec les autres valeurs vides.

  • ENUM holding values outside its list

    pas de CHECK

    Les valeurs absentes de la liste feraient échouer la contrainte CHECK, qui n'est donc pas créée.

    Ligne du rapport: enum_check_skipped

  • SET

    VARCHAR2 tel que MySQL l'écrit ('a,b')

    Oracle n'a pas de type ensemble ; le texte est celui que MySQL renvoie.

  • JSON

    CLOB

    Les fonctions JSON d'Oracle lisent le JSON depuis du texte sur chaque version, et un CLOB garde des valeurs de toute taille.

  • NUL bytes in text

    conservé

    VARCHAR2 et CLOB peuvent contenir un caractère NUL, donc la valeur est copiée telle quelle.

  • text that isn't valid in its character set

    les octets invalides deviennent le caractère de remplacement

    Le texte doit être lu comme des caractères pour être écrit en VARCHAR2.

    Ligne du rapport: invalid_utf8_replaced

  • text decoded twice (ñ)

    copié tel quel

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

    Ligne du rapport: mojibake_suspected

  • AUTO_INCREMENT

    GENERATED BY DEFAULT ON NULL AS IDENTITY, redémarré après les identifiants copiés

    Les identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé ou après l'AUTO_INCREMENT du dump, selon le plus grand.

  • MyISAM AUTO_INCREMENT on the second column of a key

    un seul compteur pour la table

    MyISAM compte par groupe de la première colonne de la clé ; Oracle a un compteur par table.

    Ligne du rapport: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    un déclencheur BEFORE UPDATE

    Le déclencheur met la colonne à l'heure actuelle quand une mise à jour ne la définit pas.

    Ligne du rapport: on_update_trigger

  • generated columns

    colonnes virtuelles

    Oracle ne calcule les colonnes générées qu'à la lecture ; les colonnes STORED deviennent virtuelles avec les mêmes valeurs.

    Ligne du rapport: stored_as_virtual

  • generated columns with functions Oracle lacks

    une colonne simple

    Une formule qui ne peut pas être écrite pour Oracle laisse une colonne simple et une ligne dans le rapport.

    Ligne du rapport: generated_not_translated

  • INVISIBLE columns

    colonnes INVISIBLE

    Oracle cache les colonnes invisibles de SELECT * comme le fait MySQL.

  • CHECK constraints

    traduites, en ligne dans CREATE TABLE

    Les CHECK en ligne sont vérifiés au chargement de chaque ligne.

  • CHECK constraints with functions Oracle lacks

    non créée

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

    Ligne du rapport: check_skipped

  • CHECK ... NOT ENFORCED

    non créée

    MySQL garde ces contraintes CHECK sans les appliquer, donc les lignes peuvent les enfreindre.

    Ligne du rapport: check_not_enforced

  • defaults with functions Oracle lacks

    aucune valeur par défaut

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

    Ligne du rapport: default_not_translated

  • keys and indexes on a prefix, c(20)

    un index sur SUBSTR de la colonne

    Un index de fonction sur le même début de la colonne distingue les mêmes lignes, et indexe les colonnes CLOB qu'Oracle ne peut pas indexer en entier.

    Ligne du rapport: prefix_unique

  • FULLTEXT indexes

    non créée

    Oracle Text gère la recherche plein texte avec son propre type d'index et ses propres requêtes.

    Ligne du rapport: fulltext_not_created

  • SPATIAL indexes

    non créée

    Les géométries sont stockées en octets WKB, qu'un index spatial ne sait pas lire.

    Ligne du rapport: spatial_index_not_created

  • functional indexes, and indexes on whole CLOB or BLOB columns

    non créé

    Oracle ne peut pas indexer un objet volumineux en entier, et certaines fonctions MySQL n'ont pas d'équivalent Oracle.

    Ligne du rapport: index_skipped

  • foreign keys

    après les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelins

    Les dumps se chargent avec FOREIGN_KEY_CHECKS=0 et MyISAM ne vérifie jamais, donc les lignes sans parent sont fréquentes. La clé vérifie tout de suite les nouvelles lignes et est validée en dernier ; des orphelins la laissent non validée avec un avertissement au lieu d'arrêter le chargement.

  • ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT

    supprimé

    Les clés étrangères d'Oracle n'agissent qu'à la suppression, avec CASCADE ou SET NULL.

    Ligne du rapport: foreign_key_action_unsupported

  • foreign keys to columns without a unique key

    non créée

    Oracle exige une clé primaire ou une contrainte unique sur les colonnes référencées ; InnoDB non.

    Ligne du rapport: foreign_key_skipped

  • table and column names

    en majuscules pour les noms simples, sinon tels qu'écrits

    Oracle stocke en majuscules les noms écrits sans guillemets ; les noms simples passent donc en majuscules et les requêtes peuvent omettre les guillemets. Les autres noms gardent leur casse et exigent des guillemets.

    Ligne du rapport: identifier_renamed

  • names over 128 bytes

    raccourci

    Depuis Oracle 12.2, les noms font 128 octets au plus.

    Ligne du rapport: name_shortened

  • GEOMETRY, POINT, POLYGON...

    BLOB contenant du WKB

    WKB est la forme standard que lit chaque bibliothèque spatiale ; SDO_GEOMETRY exige les métadonnées d'Oracle Spatial.

    Ligne du rapport: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    VARCHAR2(39), VARCHAR2(36)

    Oracle n'a aucun de ces types ; le texte est celui que MariaDB renvoie.

  • BINARY, VARBINARY, BLOB

    RAW jusqu'à 2000 octets, sinon BLOB

    Les octets restent des octets.

  • PARTITION BY

    une seule table

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

    Ligne du rapport: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    une table avec les lignes actuelles

    Un dump ne contient que les lignes actuelles.

    Ligne du rapport: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    une table ordinaire

    Oracle a un seul moteur de tables.

    Ligne du rapport: engine_dropped

  • views, triggers, procedures, functions and events

    listés dans le rapport

    Leur code est écrit dans le langage de MySQL ; ils sont donc listés pour que vous les recréiez.

    Ligne du rapport: not_converted_objects

  • dumps without CREATE TABLE

    types déduits des valeurs

    Un dump fait avec --no-create-info ne contient que des lignes, donc les types viennent des valeurs.

    Ligne du rapport: no_schema

  • geometries in a dump without CREATE TABLE

    BLOB contenant du WKB

    Le format de géométrie de MySQL est reconnu à partir des valeurs et stocké en WKB standard.

    Ligne du rapport: geometry_inferred

  • _ci collations

    comparaison exacte

    Oracle compare le texte exactement, sauf indication contraire.

    Ligne du rapport: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    converti, avec un avertissement

    Le mysqldump de MySQL 5.x écrit par défaut en utf8 sur 3 octets et remplace chaque emoji par un point d'interrogation avant qu'un convertisseur ne voie le fichier.

    Ligne du rapport: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    lu comme Latin-1 (Windows-1252)

    Le latin1 de MySQL est le Windows-1252, l'encodage habituel de ces dumps.

    Ligne du rapport: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    lu comme UTF-8, avec un avertissement

    Ces encodages ne sont pas encore décodés.

    Ligne du rapport: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    évaluées

    Certains outils de dump écrivent les valeurs sous forme de ces appels ; ils sont lus comme les valeurs qu'ils produisent, le WKT géographique étant remis avec la longitude en premier.

  • other expressions in rows

    NULL

    Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.

    Ligne du rapport: expression_value

  • DEFAULT in VALUES

    la valeur par défaut de la colonne

    Une valeur par défaut littérale est copiée dans la ligne.

    Ligne du rapport: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Il n'y a aucune valeur à copier.

    Ligne du rapport: default_keyword_null

  • REPLACE and INSERT IGNORE

    lignes simples

    Un dump a une ligne par clé, donc les lignes sont les mêmes.

    Ligne du rapport: replace_as_insert

  • types IntoSQL doesn't know

    CLOB

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

    Ligne du rapport: unknown_type

  • values that don't fit their column

    NULL

    Un dump endommagé ou écrit à la main peut contenir des valeurs que sa colonne n'accepte pas ; elles deviennent NULL pour que le reste se charge.

    Ligne du rapport: invalid_value_null

  • unreadable geometries

    NULL

    Des octets qui ne forment pas une géométrie ne peuvent pas être stockés comme telle.

    Ligne du rapport: bad_geometry

  • dumps of several databases

    un seul schéma, chaque table préfixée par le nom de sa base

    Le script se charge dans le schéma de l'utilisateur qui l'exécute ; les tables de bases différentes reçoivent donc le nom de leur base en préfixe.

    Ligne du rapport: databases_merged

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE, à la valeur atteinte

    Les séquences Oracle fonctionnent de la même façon.

  • VECTOR(n) (MariaDB 11.7+)

    CLOB avec les flottants en tableau JSON

    Seul Oracle 23ai a un type vector ; un tableau JSON garde chaque flottant dans toutes les versions.

    Ligne du rapport: type_replaced

Dans MySQLDans OracleLigne du rapport
TINYINT(1), BOOLNUMBER(1) avec un CHECK de 0 et 1 si chaque valeur vaut 0 ou 1, sinon NUMBER(3)Le BOOL de MySQL est un TINYINT(1) qui peut contenir tout nombre de -128 à 127. Oracle avant 23ai n'a pas de colonne booléenne, donc une colonne de 0 et 1 devient NUMBER(1) avec un CHECK ; une colonne qui contient 2 ou -1 garde ses nombres.bool_kept_numeric
UNSIGNED integersNUMBER assez large pour la plage, avec un CHECK qui interdit les négatifsLe NUMBER d'Oracle contient tout entier des largeurs de MySQL ; la contrainte CHECK écarte les valeurs négatives comme le faisait MySQL.
ZEROFILL and display widthssuppriméLe remplissage par des zéros est une façon d'afficher un nombre, pas une partie du nombre. Les nombres sont conservés ; formatez-les à la lecture si le remplissage compte.zerofill_dropped
FLOAT(M,D)BINARY_FLOAT ou BINARY_DOUBLE, sans l'échelleLes flottants binaires d'Oracle n'ont pas d'échelle fixe. Les valeurs stockées sont copiées telles quelles.float_scale_dropped
DECIMAL(p,s)NUMBER(p,s) jusqu'à 38 chiffres ; VARCHAR2 au-delàLe NUMBER d'Oracle contient 38 chiffres. Les décimaux plus larges sont gardés en texte pour que chaque chiffre reste exact.decimal_as_text
BIT(1), BIT(n)NUMBER(1), NUMBER(19) jusqu'à 63 bits, NUMBER(20) pour BIT(64)Les champs de bits sont stockés comme le nombre que forment leurs bits.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLOracle ne stocke que de vraies dates du calendrier. MySQL garde les dates zéro et impossibles quand son mode SQL les autorise ; elles deviennent NULL et le rapport les compte.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL, chaînes vides comprises, ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.not_null_relaxed
empty strings and empty binary valuesNULLOracle stocke une chaîne vide comme NULL, donc une valeur qui valait ' se relit comme NULL. Le rapport les compte par colonne.empty_string_null
DEFAULT '0000-00-00'aucune valeur par défautUne valeur par défaut qu'Oracle ne peut pas stocker est omise plutôt que remplacée par une date inventée.zero_date_default
TIMEINTERVAL DAY TO SECOND, qui contient des duréesOracle n'a pas de type heure du jour, et le TIME de MySQL est une durée de -838:59:59 à 838:59:59 ; un intervalle contient chaque valeur.
YEARNUMBER(4) avec un CHECK de sa plageOracle n'a pas de type année ; le CHECK garde les mêmes valeurs que MySQL autorise.
CHAR(n), VARCHAR(n)VARCHAR2(n CHAR), en caractèresLes longueurs comptent les caractères comme celles de MySQL, et MySQL renvoie les valeurs CHAR sans espaces de fin, telles que VARCHAR2 les garde.
VARCHAR(n) and TEXT longer than 4000 bytesCLOBUn VARCHAR2 contient 4000 octets par défaut, donc un texte plus long devient un CLOB ; une colonne dont toutes les valeurs tiennent garde VARCHAR2.text_as_lob
DATETIMETIMESTAMPUn DATETIME est une date et une heure locales, sans fuseau horaire, comme TIMESTAMP. DATE devient le DATE d'Oracle, qui contient aussi une heure du jour, laissée à minuit.
TIMESTAMPTIMESTAMP WITH TIME ZONE dans le fuseau indiqué par le dump, UTC s'il n'en indique aucunUn TIMESTAMP est un instant. Les dumps indiquent le fuseau dans lequel ils l'ont écrit (mysqldump écrit en UTC) ; sinon, les valeurs sont lues en UTC et le rapport le signale.timestamp_zone_assumed
ENUMVARCHAR2 avec un CHECK de ses valeursUn texte avec une contrainte CHECK garde les mêmes valeurs.
ENUM holding '' (MySQL's error value)NULLMySQL stocke une chaîne vide quand une valeur invalide entre dans un ENUM avec un mode SQL permissif. Oracle la stocke comme NULL, ce que la contrainte CHECK autorise, et le rapport la compte avec les autres valeurs vides.
ENUM holding values outside its listpas de CHECKLes valeurs absentes de la liste feraient échouer la contrainte CHECK, qui n'est donc pas créée.enum_check_skipped
SETVARCHAR2 tel que MySQL l'écrit ('a,b')Oracle n'a pas de type ensemble ; le texte est celui que MySQL renvoie.
JSONCLOBLes fonctions JSON d'Oracle lisent le JSON depuis du texte sur chaque version, et un CLOB garde des valeurs de toute taille.
NUL bytes in textconservéVARCHAR2 et CLOB peuvent contenir un caractère NUL, donc la valeur est copiée telle quelle.
text that isn't valid in its character setles octets invalides deviennent le caractère de remplacementLe texte doit être lu comme des caractères pour être écrit en VARCHAR2.invalid_utf8_replaced
text decoded twice (ñ)copié tel quelLe dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.mojibake_suspected
AUTO_INCREMENTGENERATED BY DEFAULT ON NULL AS IDENTITY, redémarré après les identifiants copiésLes identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé ou après l'AUTO_INCREMENT du dump, selon le plus grand.
MyISAM AUTO_INCREMENT on the second column of a keyun seul compteur pour la tableMyISAM compte par groupe de la première colonne de la clé ; Oracle a un compteur par table.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPun déclencheur BEFORE UPDATELe déclencheur met la colonne à l'heure actuelle quand une mise à jour ne la définit pas.on_update_trigger
generated columnscolonnes virtuellesOracle ne calcule les colonnes générées qu'à la lecture ; les colonnes STORED deviennent virtuelles avec les mêmes valeurs.stored_as_virtual
generated columns with functions Oracle lacksune colonne simpleUne formule qui ne peut pas être écrite pour Oracle laisse une colonne simple et une ligne dans le rapport.generated_not_translated
INVISIBLE columnscolonnes INVISIBLEOracle cache les colonnes invisibles de SELECT * comme le fait MySQL.
CHECK constraintstraduites, en ligne dans CREATE TABLELes CHECK en ligne sont vérifiés au chargement de chaque ligne.
CHECK constraints with functions Oracle lacksnon crééeUne contrainte CHECK qui ne peut pas être écrite pour Oracle est omise et signalée.check_skipped
CHECK ... NOT ENFORCEDnon crééeMySQL garde ces contraintes CHECK sans les appliquer, donc les lignes peuvent les enfreindre.check_not_enforced
defaults with functions Oracle lacksaucune valeur par défautUne valeur par défaut qui ne peut pas être écrite pour Oracle est omise et signalée.default_not_translated
keys and indexes on a prefix, c(20)un index sur SUBSTR de la colonneUn index de fonction sur le même début de la colonne distingue les mêmes lignes, et indexe les colonnes CLOB qu'Oracle ne peut pas indexer en entier.prefix_unique
FULLTEXT indexesnon crééeOracle Text gère la recherche plein texte avec son propre type d'index et ses propres requêtes.fulltext_not_created
SPATIAL indexesnon crééeLes géométries sont stockées en octets WKB, qu'un index spatial ne sait pas lire.spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columnsnon crééOracle ne peut pas indexer un objet volumineux en entier, et certaines fonctions MySQL n'ont pas d'équivalent Oracle.index_skipped
foreign keysaprès les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelinsLes dumps se chargent avec FOREIGN_KEY_CHECKS=0 et MyISAM ne vérifie jamais, donc les lignes sans parent sont fréquentes. La clé vérifie tout de suite les nouvelles lignes et est validée en dernier ; des orphelins la laissent non validée avec un avertissement au lieu d'arrêter le chargement.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTsuppriméLes clés étrangères d'Oracle n'agissent qu'à la suppression, avec CASCADE ou SET NULL.foreign_key_action_unsupported
foreign keys to columns without a unique keynon crééeOracle exige une clé primaire ou une contrainte unique sur les colonnes référencées ; InnoDB non.foreign_key_skipped
table and column namesen majuscules pour les noms simples, sinon tels qu'écritsOracle stocke en majuscules les noms écrits sans guillemets ; les noms simples passent donc en majuscules et les requêtes peuvent omettre les guillemets. Les autres noms gardent leur casse et exigent des guillemets.identifier_renamed
names over 128 bytesraccourciDepuis Oracle 12.2, les noms font 128 octets au plus.name_shortened
GEOMETRY, POINT, POLYGON...BLOB contenant du WKBWKB est la forme standard que lit chaque bibliothèque spatiale ; SDO_GEOMETRY exige les métadonnées d'Oracle Spatial.geometry_as_blob
INET4, INET6, UUID (MariaDB)VARCHAR2(39), VARCHAR2(36)Oracle n'a aucun de ces types ; le texte est celui que MariaDB renvoie.
BINARY, VARBINARY, BLOBRAW jusqu'à 2000 octets, sinon BLOBLes octets restent des octets.
PARTITION BYune seule tableLes lignes sont les mêmes ; partitionnez à nouveau la table dans Oracle si besoin.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)une table avec les lignes actuellesUn dump ne contient que les lignes actuelles.system_versioning_dropped
MyISAM, MEMORY and other enginesune table ordinaireOracle a un seul moteur de tables.engine_dropped
views, triggers, procedures, functions and eventslistés dans le rapportLeur code est écrit dans le langage de MySQL ; ils sont donc listés pour que vous les recréiez.not_converted_objects
dumps without CREATE TABLEtypes déduits des valeursUn dump fait avec --no-create-info ne contient que des lignes, donc les types viennent des valeurs.no_schema
geometries in a dump without CREATE TABLEBLOB contenant du WKBLe format de géométrie de MySQL est reconnu à partir des valeurs et stocké en WKB standard.geometry_inferred
_ci collationscomparaison exacteOracle compare le texte exactement, sauf indication contraire.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesconverti, avec un avertissementLe mysqldump de MySQL 5.x écrit par défaut en utf8 sur 3 octets et remplace chaque emoji par un point d'interrogation avant qu'un convertisseur ne voie le fichier.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8lu comme Latin-1 (Windows-1252)Le latin1 de MySQL est le Windows-1252, l'encodage habituel de ces dumps.charset_guessed
sjis, cp932, gbk, big5 dumpslu comme UTF-8, avec un avertissementCes encodages ne sont pas encore décodés.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsévaluéesCertains outils de dump écrivent les valeurs sous forme de ces appels ; ils sont lus comme les valeurs qu'ils produisent, le WKT géographique étant remis avec la longitude en premier.
other expressions in rowsNULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.expression_value
DEFAULT in VALUESla valeur par défaut de la colonneUne valeur par défaut littérale est copiée dans la ligne.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLIl n'y a aucune valeur à copier.default_keyword_null
REPLACE and INSERT IGNORElignes simplesUn dump a une ligne par clé, donc les lignes sont les mêmes.replace_as_insert
types IntoSQL doesn't knowCLOBLe texte contient n'importe quelle valeur ; changez le type après le chargement.unknown_type
values that don't fit their columnNULLUn dump endommagé ou écrit à la main peut contenir des valeurs que sa colonne n'accepte pas ; elles deviennent NULL pour que le reste se charge.invalid_value_null
unreadable geometriesNULLDes octets qui ne forment pas une géométrie ne peuvent pas être stockés comme telle.bad_geometry
dumps of several databasesun seul schéma, chaque table préfixée par le nom de sa baseLe script se charge dans le schéma de l'utilisateur qui l'exécute ; les tables de bases différentes reçoivent donc le nom de leur base en préfixe.databases_merged
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE, à la valeur atteinteLes séquences Oracle fonctionnent de la même façon.
VECTOR(n) (MariaDB 11.7+)CLOB avec les flottants en tableau JSONSeul Oracle 23ai a un type vector ; un tableau JSON garde chaque flottant dans toutes les versions.type_replaced

Charger le script dans Oracle

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.

NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mysql.oracle.sql

Les clés étrangères sont ajoutées ENABLE NOVALIDATE, donc les nouvelles lignes sont vérifiées tout de suite, puis validées. Si une ancienne ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non validée, au lieu d'échouer à mi-chemin.

Pour un gros dump, exécutez SQL*Plus sur la machine de la base de données. Le script valide toutes les 100 lignes. L'utilisateur qui l'exécute a besoin de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER et CREATE PROCEDURE, et d'un quota sur son tablespace.

Faire le dump MySQL pour un meilleur résultat

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

  • --default-character-set=utf8mb4 garde les emoji et autres caractères sur 4 octets, qu'un dump utf8 perd avant que le convertisseur ne le voie.
  • --hex-blob écrit les colonnes binaires en hexadécimal, ce qui résiste aux copies entre systèmes.
  • --routines --triggers --events ajoutent ces objets au dump, pour que le rapport puisse les lister.

Ce qui n'est pas converti

Les vues, déclencheurs, procédures stockées, fonctions et événements sont écrits dans le langage propre à chaque base de données. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour Oracle.

Questions sur MySQL vers Oracle

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.

Lit-il les dumps MariaDB ?

Oui. Les dumps de mariadb-dump et de MariaDB 10.3 à 12 se convertissent de la même façon, y compris les colonnes INET6, INET4 et UUID de MariaDB.

Que deviennent les dates 0000-00-00 ?

Oracle n'a pas de date zéro ; elles deviennent donc NULL et la colonne accepte NULL. Le rapport indique combien il y en avait dans chaque colonne. Les chaînes vides deviennent aussi NULL, car Oracle les stocke ainsi.

Les valeurs AUTO_INCREMENT sont-elles conservées ?

Oui. Chaque colonne AUTO_INCREMENT devient une colonne d'identité, chaque ligne garde son identifiant, et le prochain identifiant reprend après le plus élevé, ou après l'AUTO_INCREMENT de la table s'il est plus grand.

TINYINT(1) devient-il boolean ?

Oracle avant 23ai n'a pas de colonne booléenne. Une colonne dont toutes les valeurs valent 0 ou 1 devient NUMBER(1) avec un CHECK qui la garde ainsi ; une colonne qui contient d'autres nombres les garde, et le rapport explique pourquoi.

Et les procédures stockées et les déclencheurs ?

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. ON UPDATE CURRENT_TIMESTAMP est l'exception : il devient un déclencheur Oracle.

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

Oracle 19c et versions ultérieures. Chaque dump de test se charge sur 21c et 23ai, et s'arrête à la première erreur en cas de problème.