Naar de inhoud
IntoSQL-startpagina

MySQL omzetten naar Oracle

Zet een dump van mysqldump, mariadb-dump, mysqlpump, phpMyAdmin of Adminer neer, als .sql of .sql.gz, en download een Oracle-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die Oracle niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

Je bestand
sqlshop_2024.sqlVoorbeeldbestand, 5,1 kB
Je database

18 rijen geconverteerd, 4 correcties, geen afgewezen

Tonen

Tabellen in shop_2024.sqlMySQL 8.0.46-dump · geschreven door mysqldump · utf8mb4

  • customersgeschreven als CUSTOMERS8 rijen2
    7 kolommen
    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
  • ordersgeschreven als ORDERS10 rijen2
    9 kolommen
    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;

Correcties

  1. "signed_up" van customers staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
  2. De standaardwaarde van "signed_up" in customers, 0000‑00‑00, is geen datum die Oracle accepteert, dus de kolom heeft geen standaardwaarde.
  3. "status" van orders staat nu NULL toe: sommige waarden konden niet worden opgeslagen en zijn NULL.
  4. "updated_at" van orders verandert bij elke update in de huidige tijd; in Oracle doet een trigger dat.

Na te kijken

  • 1 waarde in "signed_up" van customers is een nul- of onmogelijke datum zoals 0000‑00‑00, die Oracle niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
  • 1 waarde in "shipped_at" van orders is een nul- of onmogelijke datum zoals 0000‑00‑00 00:00:00, die Oracle niet kan opslaan, dus die is NULL. Als die datums iets betekenen, vervang ze dan in de bron door echte datums voordat je de dump maakt.
  • 1 lege waarde in "status" van orders is NULL geworden; Oracle slaat een lege string op als NULL. Waar query's deze kolom vergelijken met ', vergelijk dan met IS NULL.

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

Andere voorbeelden:

Wat er verandert van MySQL naar Oracle

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

  • TINYINT(1), BOOL

    NUMBER(1) met een CHECK op 0 en 1 als elke waarde 0 of 1 is, anders NUMBER(3)

    BOOL in MySQL is een TINYINT(1) die elk getal van -128 tot 127 kan bevatten. Oracle vóór 23ai heeft geen boolean-kolom, dus een kolom met 0 en 1 wordt NUMBER(1) met een check; een kolom met 2 of -1 behoudt zijn getallen.

    Rapportregel: bool_kept_numeric

  • UNSIGNED integers

    NUMBER, breed genoeg voor het bereik, met een CHECK dat het niet negatief is

    NUMBER in Oracle bevat elk geheel getal van de breedtes die MySQL heeft; de check houdt negatieve waarden buiten, zoals MySQL deed.

  • ZEROFILL and display widths

    weggelaten

    Opvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet.

    Rapportregel: zerofill_dropped

  • FLOAT(M,D)

    BINARY_FLOAT of BINARY_DOUBLE, zonder de schaal

    Binaire drijvendekommagetallen in Oracle hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd.

    Rapportregel: float_scale_dropped

  • DECIMAL(p,s)

    NUMBER(p,s) tot 38 cijfers; daarboven VARCHAR2

    NUMBER in Oracle bevat 38 cijfers. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft.

    Rapportregel: decimal_as_text

  • BIT(1), BIT(n)

    NUMBER(1), NUMBER(19) tot 63 bits, NUMBER(20) voor BIT(64)

    Bitvelden worden opgeslagen als het getal dat hun bits vormen.

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

    NULL

    Oracle slaat alleen echte kalenderdatums op. MySQL bewaart nul- en onmogelijke datums als de SQL-modus dat toestaat; ze worden NULL en het rapport telt ze.

    Rapportregel: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL weggelaten

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

    Rapportregel: not_null_relaxed

  • empty strings and empty binary values

    NULL

    Oracle slaat een lege string op als NULL, dus een waarde die ' was, wordt teruggelezen als NULL. Het rapport telt ze per kolom.

    Rapportregel: empty_string_null

  • DEFAULT '0000-00-00'

    geen standaardwaarde

    Een standaardwaarde die Oracle niet kan opslaan, wordt weggelaten in plaats van vervangen door een verzonnen datum.

    Rapportregel: zero_date_default

  • TIME

    INTERVAL DAY TO SECOND, dat duren bevat

    Oracle heeft geen type voor een tijdstip, en TIME in MySQL is een duur van -838:59:59 tot 838:59:59; een interval bevat elke waarde.

  • YEAR

    NUMBER(4) met een CHECK op het bereik

    Oracle heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat.

  • CHAR(n), VARCHAR(n)

    VARCHAR2(n CHAR), in tekens geteld

    Lengtes tellen tekens zoals die van MySQL, en MySQL geeft CHAR-waarden terug zonder spaties aan het einde, zoals VARCHAR2 ze bewaart.

  • VARCHAR(n) and TEXT longer than 4000 bytes

    CLOB

    Een VARCHAR2 bevat standaard 4000 bytes, dus langere tekst wordt een CLOB; een kolom waarvan alle waarden passen, houdt VARCHAR2.

    Rapportregel: text_as_lob

  • DATETIME

    TIMESTAMP

    Een DATETIME is een kloktijd zonder tijdzone, net als TIMESTAMP. DATE wordt DATE in Oracle, dat ook een tijdstip bevat dat op middernacht blijft.

  • TIMESTAMP

    TIMESTAMP WITH TIME ZONE in de zone die de dump vermeldt, UTC als die er geen vermeldt

    Een TIMESTAMP is een moment. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat.

    Rapportregel: timestamp_zone_assumed

  • ENUM

    VARCHAR2 met een CHECK op de waarden

    Tekst met een check houdt dezelfde waarden.

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

    NULL

    MySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Oracle slaat die op als NULL, wat de check toestaat, en het rapport telt hem bij de andere lege waarden.

  • ENUM holding values outside its list

    geen CHECK

    Waarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.

    Rapportregel: enum_check_skipped

  • SET

    VARCHAR2 zoals MySQL het schrijft ('a,b')

    Oracle heeft geen settype; de tekst is die MySQL teruggeeft.

  • JSON

    CLOB

    De JSON-functies van Oracle lezen JSON uit tekst op elke versie, en een CLOB bewaart waarden van elke grootte.

  • NUL bytes in text

    behouden

    VARCHAR2 en CLOB kunnen een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.

  • text that isn't valid in its character set

    de foute bytes als het vervangingsteken

    Tekst moet als tekens worden gelezen om als VARCHAR2 te worden geschreven.

    Rapportregel: invalid_utf8_replaced

  • text decoded twice (ñ)

    ongewijzigd gekopieerd

    De dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.

    Rapportregel: mojibake_suspected

  • AUTO_INCREMENT

    GENERATED BY DEFAULT ON NULL AS IDENTITY, herstart voorbij de gekopieerde id's

    De gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste daarvan of na de AUTO_INCREMENT van de dump, welke hoger is.

  • MyISAM AUTO_INCREMENT on the second column of a key

    één teller voor de tabel

    MyISAM telt per groep van de eerste kolom van de sleutel; Oracle heeft één teller per tabel.

    Rapportregel: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    een BEFORE UPDATE-trigger

    De trigger zet de kolom op de huidige tijd als een update hem niet instelt.

    Rapportregel: on_update_trigger

  • generated columns

    virtuele kolommen

    Oracle berekent gegenereerde kolommen alleen bij het lezen; STORED-kolommen worden virtueel met dezelfde waarden.

    Rapportregel: stored_as_virtual

  • generated columns with functions Oracle lacks

    een gewone kolom

    Een formule die niet voor Oracle kan worden geschreven, levert een gewone kolom en een regel in het rapport op.

    Rapportregel: generated_not_translated

  • INVISIBLE columns

    INVISIBLE-kolommen

    Oracle verbergt onzichtbare kolommen voor SELECT *, zoals MySQL doet.

  • CHECK constraints

    vertaald, inline in CREATE TABLE

    Inline checks worden getest terwijl elke rij laadt.

  • CHECK constraints with functions Oracle lacks

    niet aangemaakt

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

    Rapportregel: check_skipped

  • CHECK ... NOT ENFORCED

    niet aangemaakt

    MySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.

    Rapportregel: check_not_enforced

  • defaults with functions Oracle lacks

    geen standaardwaarde

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

    Rapportregel: default_not_translated

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

    een index op SUBSTR van de kolom

    Een functie-index op hetzelfde begin van de kolom houdt dezelfde rijen uit elkaar, en indexeert CLOB-kolommen die Oracle niet in hun geheel kan indexeren.

    Rapportregel: prefix_unique

  • FULLTEXT indexes

    niet aangemaakt

    Oracle Text bouwt zoeken in volledige tekst met een eigen indextype en eigen query's.

    Rapportregel: fulltext_not_created

  • SPATIAL indexes

    niet aangemaakt

    Geometrieën worden opgeslagen als WKB-bytes, die een ruimtelijke index niet kan lezen.

    Rapportregel: spatial_index_not_created

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

    niet aangemaakt

    Oracle kan een groot object niet in zijn geheel indexeren, en sommige MySQL-functies hebben geen equivalent in Oracle.

    Rapportregel: index_skipped

  • foreign keys

    na de data, ENABLE NOVALIDATE, daarna gevalideerd met een waarschuwing bij wezen

    Dumps laden met FOREIGN_KEY_CHECKS=0 en MyISAM controleert nooit, dus rijen zonder ouder komen vaak voor. De sleutel controleert nieuwe rijen meteen en wordt als laatste gevalideerd; wezen laten hem ongevalideerd met een waarschuwing, in plaats van het laden te stoppen.

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

    weggelaten

    Refererende sleutels in Oracle werken alleen bij verwijderen, met CASCADE of SET NULL.

    Rapportregel: foreign_key_action_unsupported

  • foreign keys to columns without a unique key

    niet aangemaakt

    Oracle heeft een primaire sleutel of een unieke constraint nodig op de kolommen waarnaar wordt verwezen; InnoDB niet.

    Rapportregel: foreign_key_skipped

  • table and column names

    hoofdletters als het eenvoudige namen zijn, anders zoals geschreven

    Oracle slaat namen zonder aanhalingstekens op in hoofdletters, dus eenvoudige namen worden hoofdletters en query's kunnen de aanhalingstekens weglaten; andere namen houden hun hoofdletters en hebben aanhalingstekens nodig.

    Rapportregel: identifier_renamed

  • names over 128 bytes

    ingekort

    Namen in Oracle 12.2 en later bevatten 128 bytes.

    Rapportregel: name_shortened

  • GEOMETRY, POINT, POLYGON...

    BLOB met WKB

    WKB is het standaardformaat dat elke ruimtelijke bibliotheek leest; SDO_GEOMETRY heeft de metadata van Oracle Spatial nodig.

    Rapportregel: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    VARCHAR2(39), VARCHAR2(36)

    Oracle heeft geen van beide typen; de tekst is die MariaDB teruggeeft.

  • BINARY, VARBINARY, BLOB

    RAW tot 2000 bytes, anders BLOB

    Bytes blijven bytes.

  • PARTITION BY

    één tabel

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

    Rapportregel: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    een tabel met de huidige rijen

    Een dump bevat alleen de huidige rijen.

    Rapportregel: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    een gewone tabel

    Oracle heeft één tabelengine.

    Rapportregel: engine_dropped

  • views, triggers, procedures, functions and events

    vermeld in het rapport

    Hun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.

    Rapportregel: not_converted_objects

  • dumps without CREATE TABLE

    typen afgeleid uit de waarden

    Een dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden.

    Rapportregel: no_schema

  • geometries in a dump without CREATE TABLE

    BLOB met WKB

    Het geometrieformaat van MySQL wordt herkend aan de waarden en opgeslagen als standaard-WKB.

    Rapportregel: geometry_inferred

  • _ci collations

    exacte vergelijking

    Oracle vergelijkt tekst exact, tenzij anders aangegeven.

    Rapportregel: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    geconverteerd, met een waarschuwing

    mysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet.

    Rapportregel: dump_lost_four_byte_chars

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

    gelezen als Latin-1 (Windows-1252)

    latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.

    Rapportregel: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    gelezen als UTF-8, met een waarschuwing

    Deze coderingen worden nog niet gedecodeerd.

    Rapportregel: unsupported_charset

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

    geëvalueerd

    Sommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst.

  • other expressions in rows

    NULL

    Een converter die geen database draait, kan ze niet evalueren.

    Rapportregel: expression_value

  • DEFAULT in VALUES

    de standaardwaarde van de kolom

    Een letterlijke standaardwaarde wordt in de rij gekopieerd.

    Rapportregel: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Er is geen waarde om te kopiëren.

    Rapportregel: default_keyword_null

  • REPLACE and INSERT IGNORE

    gewone rijen

    Een dump heeft één rij per sleutel, dus de rijen zijn dezelfde.

    Rapportregel: replace_as_insert

  • types IntoSQL doesn't know

    CLOB

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

    Rapportregel: unknown_type

  • values that don't fit their column

    NULL

    Een beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt.

    Rapportregel: invalid_value_null

  • unreadable geometries

    NULL

    Bytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen.

    Rapportregel: bad_geometry

  • dumps of several databases

    één schema, elke tabel met de naam van zijn database ervoor

    Het script laadt in het schema van de gebruiker die het uitvoert, dus tabellen uit verschillende databases krijgen de naam van hun database ervoor.

    Rapportregel: databases_merged

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE, op de waarde die hij had bereikt

    Sequences in Oracle werken op dezelfde manier.

  • VECTOR(n) (MariaDB 11.7+)

    CLOB met de floats als JSON-array

    Alleen Oracle 23ai heeft een vectortype; een JSON-array behoudt elke float op elke versie.

    Rapportregel: type_replaced

In MySQLIn OracleRapportregel
TINYINT(1), BOOLNUMBER(1) met een CHECK op 0 en 1 als elke waarde 0 of 1 is, anders NUMBER(3)BOOL in MySQL is een TINYINT(1) die elk getal van -128 tot 127 kan bevatten. Oracle vóór 23ai heeft geen boolean-kolom, dus een kolom met 0 en 1 wordt NUMBER(1) met een check; een kolom met 2 of -1 behoudt zijn getallen.bool_kept_numeric
UNSIGNED integersNUMBER, breed genoeg voor het bereik, met een CHECK dat het niet negatief isNUMBER in Oracle bevat elk geheel getal van de breedtes die MySQL heeft; de check houdt negatieve waarden buiten, zoals MySQL deed.
ZEROFILL and display widthsweggelatenOpvulling met nullen is een manier om een getal te tonen, geen deel ervan. De getallen blijven; formatteer ze bij het lezen als de opvulling ertoe doet.zerofill_dropped
FLOAT(M,D)BINARY_FLOAT of BINARY_DOUBLE, zonder de schaalBinaire drijvendekommagetallen in Oracle hebben geen vaste schaal. De opgeslagen waarden worden ongewijzigd gekopieerd.float_scale_dropped
DECIMAL(p,s)NUMBER(p,s) tot 38 cijfers; daarboven VARCHAR2NUMBER in Oracle bevat 38 cijfers. Bredere decimalen blijven tekst, zodat elk cijfer exact blijft.decimal_as_text
BIT(1), BIT(n)NUMBER(1), NUMBER(19) tot 63 bits, NUMBER(20) voor BIT(64)Bitvelden worden opgeslagen als het getal dat hun bits vormen.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLOracle slaat alleen echte kalenderdatums op. MySQL bewaart nul- en onmogelijke datums als de SQL-modus dat toestaat; ze worden NULL en het rapport telt ze.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, lege strings inbegrepen, kan NOT NULL niet houden, anders zou het laden stoppen.not_null_relaxed
empty strings and empty binary valuesNULLOracle slaat een lege string op als NULL, dus een waarde die ' was, wordt teruggelezen als NULL. Het rapport telt ze per kolom.empty_string_null
DEFAULT '0000-00-00'geen standaardwaardeEen standaardwaarde die Oracle niet kan opslaan, wordt weggelaten in plaats van vervangen door een verzonnen datum.zero_date_default
TIMEINTERVAL DAY TO SECOND, dat duren bevatOracle heeft geen type voor een tijdstip, en TIME in MySQL is een duur van -838:59:59 tot 838:59:59; een interval bevat elke waarde.
YEARNUMBER(4) met een CHECK op het bereikOracle heeft geen jaartype; de check houdt dezelfde waarden die MySQL toestaat.
CHAR(n), VARCHAR(n)VARCHAR2(n CHAR), in tekens geteldLengtes tellen tekens zoals die van MySQL, en MySQL geeft CHAR-waarden terug zonder spaties aan het einde, zoals VARCHAR2 ze bewaart.
VARCHAR(n) and TEXT longer than 4000 bytesCLOBEen VARCHAR2 bevat standaard 4000 bytes, dus langere tekst wordt een CLOB; een kolom waarvan alle waarden passen, houdt VARCHAR2.text_as_lob
DATETIMETIMESTAMPEen DATETIME is een kloktijd zonder tijdzone, net als TIMESTAMP. DATE wordt DATE in Oracle, dat ook een tijdstip bevat dat op middernacht blijft.
TIMESTAMPTIMESTAMP WITH TIME ZONE in de zone die de dump vermeldt, UTC als die er geen vermeldtEen TIMESTAMP is een moment. Dumps vermelden de zone waarin ze het schreven (mysqldump schrijft UTC); zonder die vermelding worden de waarden gelezen als UTC en meldt het rapport dat.timestamp_zone_assumed
ENUMVARCHAR2 met een CHECK op de waardenTekst met een check houdt dezelfde waarden.
ENUM holding '' (MySQL's error value)NULLMySQL slaat een lege string op als er in een tolerante SQL-modus een ongeldige waarde in een ENUM komt. Oracle slaat die op als NULL, wat de check toestaat, en het rapport telt hem bij de andere lege waarden.
ENUM holding values outside its listgeen CHECKWaarden die niet in de lijst staan, zouden de check laten mislukken, dus de check wordt niet aangemaakt.enum_check_skipped
SETVARCHAR2 zoals MySQL het schrijft ('a,b')Oracle heeft geen settype; de tekst is die MySQL teruggeeft.
JSONCLOBDe JSON-functies van Oracle lezen JSON uit tekst op elke versie, en een CLOB bewaart waarden van elke grootte.
NUL bytes in textbehoudenVARCHAR2 en CLOB kunnen een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its character setde foute bytes als het vervangingstekenTekst moet als tekens worden gelezen om als VARCHAR2 te worden geschreven.invalid_utf8_replaced
text decoded twice (ñ)ongewijzigd gekopieerdDe dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.mojibake_suspected
AUTO_INCREMENTGENERATED BY DEFAULT ON NULL AS IDENTITY, herstart voorbij de gekopieerde id'sDe gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste daarvan of na de AUTO_INCREMENT van de dump, welke hoger is.
MyISAM AUTO_INCREMENT on the second column of a keyéén teller voor de tabelMyISAM telt per groep van de eerste kolom van de sleutel; Oracle heeft één teller per tabel.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPeen BEFORE UPDATE-triggerDe trigger zet de kolom op de huidige tijd als een update hem niet instelt.on_update_trigger
generated columnsvirtuele kolommenOracle berekent gegenereerde kolommen alleen bij het lezen; STORED-kolommen worden virtueel met dezelfde waarden.stored_as_virtual
generated columns with functions Oracle lackseen gewone kolomEen formule die niet voor Oracle kan worden geschreven, levert een gewone kolom en een regel in het rapport op.generated_not_translated
INVISIBLE columnsINVISIBLE-kolommenOracle verbergt onzichtbare kolommen voor SELECT *, zoals MySQL doet.
CHECK constraintsvertaald, inline in CREATE TABLEInline checks worden getest terwijl elke rij laadt.
CHECK constraints with functions Oracle lacksniet aangemaaktEen check die niet voor Oracle kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK ... NOT ENFORCEDniet aangemaaktMySQL bewaart deze checks zonder ze toe te passen, dus de rijen kunnen ze schenden.check_not_enforced
defaults with functions Oracle lacksgeen standaardwaardeEen standaardwaarde die niet voor Oracle kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
keys and indexes on a prefix, c(20)een index op SUBSTR van de kolomEen functie-index op hetzelfde begin van de kolom houdt dezelfde rijen uit elkaar, en indexeert CLOB-kolommen die Oracle niet in hun geheel kan indexeren.prefix_unique
FULLTEXT indexesniet aangemaaktOracle Text bouwt zoeken in volledige tekst met een eigen indextype en eigen query's.fulltext_not_created
SPATIAL indexesniet aangemaaktGeometrieën worden opgeslagen als WKB-bytes, die een ruimtelijke index niet kan lezen.spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columnsniet aangemaaktOracle kan een groot object niet in zijn geheel indexeren, en sommige MySQL-functies hebben geen equivalent in Oracle.index_skipped
foreign keysna de data, ENABLE NOVALIDATE, daarna gevalideerd met een waarschuwing bij wezenDumps laden met FOREIGN_KEY_CHECKS=0 en MyISAM controleert nooit, dus rijen zonder ouder komen vaak voor. De sleutel controleert nieuwe rijen meteen en wordt als laatste gevalideerd; wezen laten hem ongevalideerd met een waarschuwing, in plaats van het laden te stoppen.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTweggelatenRefererende sleutels in Oracle werken alleen bij verwijderen, met CASCADE of SET NULL.foreign_key_action_unsupported
foreign keys to columns without a unique keyniet aangemaaktOracle heeft een primaire sleutel of een unieke constraint nodig op de kolommen waarnaar wordt verwezen; InnoDB niet.foreign_key_skipped
table and column nameshoofdletters als het eenvoudige namen zijn, anders zoals geschrevenOracle slaat namen zonder aanhalingstekens op in hoofdletters, dus eenvoudige namen worden hoofdletters en query's kunnen de aanhalingstekens weglaten; andere namen houden hun hoofdletters en hebben aanhalingstekens nodig.identifier_renamed
names over 128 bytesingekortNamen in Oracle 12.2 en later bevatten 128 bytes.name_shortened
GEOMETRY, POINT, POLYGON...BLOB met WKBWKB is het standaardformaat dat elke ruimtelijke bibliotheek leest; SDO_GEOMETRY heeft de metadata van Oracle Spatial nodig.geometry_as_blob
INET4, INET6, UUID (MariaDB)VARCHAR2(39), VARCHAR2(36)Oracle heeft geen van beide typen; de tekst is die MariaDB teruggeeft.
BINARY, VARBINARY, BLOBRAW tot 2000 bytes, anders BLOBBytes blijven bytes.
PARTITION BYéén tabelDe rijen zijn dezelfde; partitioneer de tabel opnieuw in Oracle als dat nodig is.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)een tabel met de huidige rijenEen dump bevat alleen de huidige rijen.system_versioning_dropped
MyISAM, MEMORY and other engineseen gewone tabelOracle heeft één tabelengine.engine_dropped
views, triggers, procedures, functions and eventsvermeld in het rapportHun code is geschreven in de taal van MySQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.not_converted_objects
dumps without CREATE TABLEtypen afgeleid uit de waardenEen dump gemaakt met --no-create-info bevat alleen rijen, dus de typen komen uit de waarden.no_schema
geometries in a dump without CREATE TABLEBLOB met WKBHet geometrieformaat van MySQL wordt herkend aan de waarden en opgeslagen als standaard-WKB.geometry_inferred
_ci collationsexacte vergelijkingOracle vergelijkt tekst exact, tenzij anders aangegeven.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesgeconverteerd, met een waarschuwingmysqldump van MySQL 5.x schrijft standaard 3-byte utf8 en vervangt elke emoji door een vraagteken voordat een converter het bestand ziet.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8gelezen als Latin-1 (Windows-1252)latin1 in MySQL is Windows-1252, de gebruikelijke codering van zulke dumps.charset_guessed
sjis, cp932, gbk, big5 dumpsgelezen als UTF-8, met een waarschuwingDeze coderingen worden nog niet gedecodeerd.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsgeëvalueerdSommige dumptools schrijven waarden als deze aanroepen; ze worden gelezen als de waarden die ze opleveren, met geografische WKT omgezet naar lengtegraad eerst.
other expressions in rowsNULLEen converter die geen database draait, kan ze niet evalueren.expression_value
DEFAULT in VALUESde standaardwaarde van de kolomEen letterlijke standaardwaarde wordt in de rij gekopieerd.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLEr is geen waarde om te kopiëren.default_keyword_null
REPLACE and INSERT IGNOREgewone rijenEen dump heeft één rij per sleutel, dus de rijen zijn dezelfde.replace_as_insert
types IntoSQL doesn't knowCLOBTekst kan elke waarde bevatten; wijzig het type na het laden.unknown_type
values that don't fit their columnNULLEen beschadigde of met de hand geschreven dump kan waarden bevatten die de kolom niet aankan; ze worden NULL zodat de rest laadt.invalid_value_null
unreadable geometriesNULLBytes die geen geometrie zijn, kunnen niet als geometrie worden opgeslagen.bad_geometry
dumps of several databaseséén schema, elke tabel met de naam van zijn database ervoorHet script laadt in het schema van de gebruiker die het uitvoert, dus tabellen uit verschillende databases krijgen de naam van hun database ervoor.databases_merged
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE, op de waarde die hij had bereiktSequences in Oracle werken op dezelfde manier.
VECTOR(n) (MariaDB 11.7+)CLOB met de floats als JSON-arrayAlleen Oracle 23ai heeft een vectortype; een JSON-array behoudt elke float op elke versie.type_replaced

Het script in Oracle 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.

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

Refererende sleutels worden toegevoegd met ENABLE NOVALIDATE, zodat nieuwe rijen meteen worden gecontroleerd, en daarna gevalideerd. Verwijst een oude rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongevalideerd, in plaats van halverwege te mislukken.

Voer bij een grote dump SQL*Plus uit op dezelfde machine als de database. Het script commit elke 100 rijen. De gebruiker die het uitvoert, heeft CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER en CREATE PROCEDURE nodig, en quota op zijn tablespace.

Een dump van MySQL maken voor het beste resultaat

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

  • --default-character-set=utf8mb4 behoudt emoji en andere 4-bytestekens, die een utf8-dump kwijtraakt voordat de converter hem ziet.
  • --hex-blob schrijft binaire kolommen als hexadecimaal, wat kopiëren tussen systemen overleeft.
  • --routines --triggers --events voegen die objecten aan de dump toe, zodat het rapport ze kan vermelden.

Wat niet wordt geconverteerd

Weergaven, triggers, opgeslagen procedures, functies en gebeurtenissen worden geschreven in de eigen taal van elke database. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor Oracle.

Vragen over MySQL naar Oracle

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.

Leest het MariaDB-dumps?

Ja. Dumps van mariadb-dump en van MariaDB 10.3 tot en met 12 worden op dezelfde manier geconverteerd, inclusief de INET6-, INET4- en UUID-kolommen van MariaDB.

Wat gebeurt er met datums als 0000-00-00?

Oracle kent geen nuldatum, dus ze worden NULL en de kolom accepteert NULL. Het rapport vermeldt hoeveel er in elke kolom waren. Lege strings worden ook NULL, zoals Oracle ze opslaat.

Blijven AUTO_INCREMENT-waarden behouden?

Ja. Elke AUTO_INCREMENT-kolom wordt een identity-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste, of na de AUTO_INCREMENT van de tabel als die hoger is.

Wordt TINYINT(1) boolean?

Oracle vóór 23ai heeft geen boolean-kolom. Een kolom met alleen 0 of 1 wordt NUMBER(1) met een check die dat zo houdt; een kolom met andere getallen behoudt ze, en het rapport legt uit waarom.

En opgeslagen procedures en triggers?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft. ON UPDATE CURRENT_TIMESTAMP is de uitzondering: dat wordt een Oracle-trigger.

Op welke Oracle-versies laadt het script?

Oracle 19c en later. Elke testdump laadt op 21c en 23ai en stopt bij de eerste fout als er iets misgaat.