Converti MariaDB in Oracle
Trascina un dump di mariadb-dump, mysqldump, phpMyAdmin o Adminer, in .sql o .sql.gz, e scarica uno script Oracle con le stesse tabelle, chiavi, indici e dati. Ogni valore che Oracle non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.
18 righe convertite, 4 correzioni, nessuna rifiutata
Tabelle in shop_2024_mariadb.sqlDump MariaDB 11.8.9-MariaDB-ubu2404 · scritto da mariadb-dump · utf8mb4
customersscritta come CUSTOMERS8 righe2
8 colonne ID NUMBER(10) not null NAME VARCHAR2(100 CHAR) not null EMAIL VARCHAR2(150 CHAR) not null COUNTRY VARCHAR2(2 CHAR) not null IS_ACTIVE NUMBER(1) not null SIGNED_UP DATE CREATED_AT TIMESTAMP(0) WITH TIME ZONE not null LAST_IP VARCHAR2(39 CHAR) ordersscritta come ORDERS10 righe2
12 colonne ID NUMBER(10) not null CUSTOMER_ID NUMBER(10) not null STATUS VARCHAR2(9 CHAR) TOTAL NUMBER(10,2) not null ITEMS NUMBER(5) not null ORDERED_AT TIMESTAMP(0) not null SHIPPED_AT TIMESTAMP(0) NOTE VARCHAR2(255 CHAR) ORDER_REF VARCHAR2(36 CHAR) not null INVOICE NUMBER(10) not null DETAILS CLOB UPDATED_AT TIMESTAMP(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 SEQUENCE "INVOICE_NUMBERS" START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
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,
"LAST_IP" VARCHAR2(39 CHAR),
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),
"ORDER_REF" VARCHAR2(36 CHAR) NOT NULL,
"INVOICE" NUMBER(10) DEFAULT ("INVOICE_NUMBERS".NEXTVAL) NOT NULL,
"DETAILS" CLOB,
"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",
"LAST_IP"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00 +00:00',
'::ffff:203.0.113.7'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42 +00:00',
'2001:db8::1'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00 +00:00',
'::ffff:198.51.100.23'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 14:00:00 +00:00',
NULL
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00 +00:00',
'2001:db8:85a3::8a2e:370:7334'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59 +00:00',
'::ffff:192.0.2.200'
);
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT",
"LAST_IP"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12 +00:00',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
1,
1,
'shipped',
129.90,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',
1000,
'{"gift": false}',
TIMESTAMP '2024-03-02 16:30:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
2,
2,
'paid',
54.00,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',
1001,
'{"gift": true, "wrap": "red"}',
TIMESTAMP '2024-03-02 11:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
3,
1,
'cancelled',
12.50,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',
1002,
NULL,
TIMESTAMP '2024-03-03 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
4,
4,
'shipped',
980.00,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',
1003,
'{"fragile": true}',
TIMESTAMP '2024-03-07 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice',
'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',
1004,
NULL,
TIMESTAMP '2024-03-08 17:20:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"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"',
'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',
1005,
'{"fragile": true}',
TIMESTAMP '2024-03-11 09:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
7,
8,
'paid',
76.20,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',
1006,
NULL,
TIMESTAMP '2024-03-11 18:46:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
8,
2,
NULL,
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Status lost in an old import',
'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',
1007,
NULL,
TIMESTAMP '2024-03-12 08:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
9,
3,
'shipped',
64.00,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',
1008,
'{"parcels": [1, 2]}',
TIMESTAMP '2024-03-15 10:00:00 +00:00'
);
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"ORDER_REF",
"INVOICE",
"DETAILS",
"UPDATED_AT"
) VALUES (
10,
7,
'paid',
1499.00,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',
1009,
NULL,
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;
Correzioni
- "signed_up" di customers ora ammette NULL: alcuni dei suoi valori non si potevano salvare e sono NULL.
- Il valore predefinito di "signed_up" in customers, 0000‑00‑00, non è una data che Oracle accetta, quindi la colonna non ha un valore predefinito.
- "status" di orders ora ammette NULL: alcuni dei suoi valori non si potevano salvare e sono NULL.
- "updated_at" di orders passa all'ora corrente a ogni aggiornamento; in Oracle lo fa un trigger.
Da controllare
- 1 valore in "signed_up" di customers è una data zero o impossibile come 0000‑00‑00, che Oracle non può salvare, quindi è NULL. Se quelle date hanno un significato, sostituiscile nell'origine con date reali prima del dump.
- 1 valore in "shipped_at" di orders è una data zero o impossibile come 0000‑00‑00 00:00:00, che Oracle non può salvare, quindi è NULL. Se quelle date hanno un significato, sostituiscile nell'origine con date reali prima del dump.
- 1 valore vuoto in "status" di orders è diventato NULL; Oracle salva una stringa vuota come NULL. Dove le query confrontano questa colonna con ', confronta invece con IS NULL.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia da MariaDB a Oracle
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
TINYINT(1), BOOL
NUMBER(1) con un CHECK di 0 e 1 quando ogni valore è 0 o 1, altrimenti NUMBER(3)
Il BOOL di MySQL è un TINYINT(1) che può contenere qualsiasi numero da -128 a 127. Oracle prima della 23ai non ha colonne booleane, quindi una colonna di 0 e 1 è NUMBER(1) con un CHECK; una che contiene 2 o -1 mantiene i suoi numeri.
Riga del report: bool_kept_numeric
UNSIGNED integers
NUMBER abbastanza ampio per l'intervallo, con un CHECK che non sia negativo
Il NUMBER di Oracle contiene qualsiasi intero delle ampiezze di MySQL; il vincolo CHECK tiene fuori i valori negativi come faceva MySQL.
ZEROFILL and display widths
rimosso
Il riempimento con zeri è un modo di mostrare un numero, non ne fa parte. I numeri restano; formattali quando li leggi se il riempimento conta.
Riga del report: zerofill_dropped
FLOAT(M,D)
BINARY_FLOAT o BINARY_DOUBLE, senza la scala
I float binari di Oracle non hanno una scala fissa. I valori salvati vengono copiati così come sono.
Riga del report: float_scale_dropped
DECIMAL(p,s)
NUMBER(p,s) fino a 38 cifre; VARCHAR2 oltre
Il NUMBER di Oracle contiene 38 cifre. I decimali più ampi restano come testo, così ogni cifra resta esatta.
Riga del report: decimal_as_text
BIT(1), BIT(n)
NUMBER(1), NUMBER(19) fino a 63 bit, NUMBER(20) per BIT(64)
I campi di bit vengono salvati come il numero formato dai loro bit.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
Oracle salva solo date reali del calendario. MySQL conserva date zero e impossibili quando la sua modalità SQL lo consente; diventano NULL e il report le conta.
Riga del report: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL rimosso
Una colonna i cui valori sono dovuti diventare NULL, stringhe vuote incluse, non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.
Riga del report: not_null_relaxed
empty strings and empty binary values
NULL
Oracle salva una stringa vuota come NULL, quindi un valore che era ' si rilegge come NULL. Il report li conta per colonna.
Riga del report: empty_string_null
DEFAULT '0000-00-00'
nessun valore predefinito
Un valore predefinito che Oracle non può salvare viene omesso invece di essere sostituito con una data inventata.
Riga del report: zero_date_default
TIME
INTERVAL DAY TO SECOND, che contiene durate
Oracle non ha un tipo ora del giorno, e il TIME di MySQL è una durata da -838:59:59 a 838:59:59; un intervallo contiene ogni valore.
YEAR
NUMBER(4) con un CHECK del suo intervallo
Oracle non ha un tipo anno; il vincolo CHECK mantiene gli stessi valori che MySQL consente.
CHAR(n), VARCHAR(n)
VARCHAR2(n CHAR), contando i caratteri
Le lunghezze contano i caratteri come in MySQL, e MySQL restituisce i valori CHAR senza spazi finali, come li mantiene VARCHAR2.
VARCHAR(n) and TEXT longer than 4000 bytes
CLOB
Un VARCHAR2 contiene 4000 byte per impostazione predefinita, quindi il testo più lungo è un CLOB; una colonna i cui valori ci stanno tutti mantiene VARCHAR2.
Riga del report: text_as_lob
DATETIME
TIMESTAMP
Un DATETIME è l'ora letta su un orologio, senza fuso orario, come TIMESTAMP. DATE diventa il DATE di Oracle, che contiene anche un'ora del giorno che resta a mezzanotte.
TIMESTAMP
TIMESTAMP WITH TIME ZONE nel fuso indicato dal dump, UTC se non ne indica uno
Un TIMESTAMP è un istante. I dump indicano il fuso in cui lo hanno scritto (mysqldump scrive UTC); senza questa indicazione, i valori vengono letti come UTC e il report lo dice.
Riga del report: timestamp_zone_assumed
ENUM
VARCHAR2 con un CHECK dei suoi valori
Il testo con un vincolo CHECK mantiene gli stessi valori.
ENUM holding '' (MySQL's error value)
NULL
MySQL salva una stringa vuota quando un valore non valido entra in un ENUM con una modalità SQL permissiva. Oracle la salva come NULL, che il vincolo CHECK ammette, e il report la conta con gli altri valori vuoti.
ENUM holding values outside its list
nessun CHECK
I valori che la lista non nomina violerebbero il vincolo CHECK, quindi il vincolo non viene creato.
Riga del report: enum_check_skipped
SET
VARCHAR2 come lo scrive MySQL ('a,b')
Oracle non ha un tipo set; il testo è quello che restituisce MySQL.
JSON
CLOB
Le funzioni JSON di Oracle leggono il JSON dal testo su ogni versione, e un CLOB mantiene valori di qualsiasi dimensione.
NUL bytes in text
mantenuto
VARCHAR2 e CLOB possono contenere un carattere NUL, quindi il valore viene copiato così com'è.
text that isn't valid in its character set
i byte errati come carattere di sostituzione
Il testo va letto come caratteri per essere scritto come VARCHAR2.
Riga del report: invalid_utf8_replaced
text decoded twice (ñ)
copiato così com'è
Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.
Riga del report: mojibake_suspected
AUTO_INCREMENT
GENERATED BY DEFAULT ON NULL AS IDENTITY, riavviato oltre gli id copiati
Gli id copiati si caricano così come sono, e il contatore riparte dopo il più alto o dopo l'AUTO_INCREMENT del dump, se è maggiore.
MyISAM AUTO_INCREMENT on the second column of a key
un solo contatore per la tabella
MyISAM conta per gruppo della prima colonna della chiave; Oracle ha un contatore per tabella.
Riga del report: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
un trigger BEFORE UPDATE
Il trigger imposta la colonna all'ora corrente quando un aggiornamento non la imposta.
Riga del report: on_update_trigger
generated columns
colonne virtuali
Oracle calcola le colonne generate solo in lettura; le colonne STORED diventano virtuali con gli stessi valori.
Riga del report: stored_as_virtual
generated columns with functions Oracle lacks
una colonna semplice
Una formula che non si può scrivere per Oracle lascia una colonna semplice e una riga nel report.
Riga del report: generated_not_translated
INVISIBLE columns
colonne INVISIBLE
Oracle nasconde le colonne invisibili da SELECT * come fa MySQL.
CHECK constraints
tradotti, dentro CREATE TABLE
I CHECK nella tabella si verificano mentre ogni riga si carica.
CHECK constraints with functions Oracle lacks
non creato
Un vincolo CHECK che non si può scrivere per Oracle viene omesso e segnalato.
Riga del report: check_skipped
CHECK ... NOT ENFORCED
non creati
MySQL conserva questi vincoli senza applicarli, quindi le righe possono violarli.
Riga del report: check_not_enforced
defaults with functions Oracle lacks
nessun valore predefinito
Un valore predefinito che non si può scrivere per Oracle viene omesso e segnalato.
Riga del report: default_not_translated
keys and indexes on a prefix, c(20)
un indice su SUBSTR della colonna
Un indice funzionale sullo stesso inizio della colonna tiene distinte le stesse righe, e indicizza le colonne CLOB che Oracle non può indicizzare per intero.
Riga del report: prefix_unique
FULLTEXT indexes
non creato
Oracle Text gestisce la ricerca full-text con un tipo di indice e query propri.
Riga del report: fulltext_not_created
SPATIAL indexes
non creato
Le geometrie sono salvate come byte WKB, che un indice spaziale non sa leggere.
Riga del report: spatial_index_not_created
functional indexes, and indexes on whole CLOB or BLOB columns
non creato
Oracle non può indicizzare per intero un oggetto di grandi dimensioni, e alcune funzioni di MySQL non hanno un equivalente in Oracle.
Riga del report: index_skipped
foreign keys
dopo i dati ENABLE NOVALIDATE, poi validata con un avviso sulle righe orfane
I dump si caricano con FOREIGN_KEY_CHECKS=0 e MyISAM non controlla mai, quindi le righe senza un genitore sono comuni. La chiave controlla subito le nuove righe e viene validata per ultima; le righe orfane la lasciano non validata con un avviso invece di fermare il caricamento.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT
rimosso
Le chiavi esterne di Oracle agiscono solo in eliminazione, con CASCADE o SET NULL.
Riga del report: foreign_key_action_unsupported
foreign keys to columns without a unique key
non creata
Oracle richiede una chiave primaria o un vincolo univoco sulle colonne referenziate; InnoDB no.
Riga del report: foreign_key_skipped
table and column names
maiuscolo per i nomi semplici, altrimenti come scritti
Oracle salva in maiuscolo i nomi scritti senza virgolette, quindi i nomi semplici diventano maiuscoli e le query possono omettere le virgolette; gli altri nomi mantengono le maiuscole e minuscole e richiedono virgolette.
Riga del report: identifier_renamed
names over 128 bytes
accorciato
In Oracle 12.2 e successive i nomi arrivano a 128 byte.
Riga del report: name_shortened
GEOMETRY, POINT, POLYGON...
BLOB con WKB
WKB è la forma standard che ogni libreria spaziale legge; SDO_GEOMETRY richiede i metadati di Oracle Spatial.
Riga del report: geometry_as_blob
INET4, INET6, UUID (MariaDB)
VARCHAR2(39), VARCHAR2(36)
Oracle non ha nessuno dei due tipi; il testo è quello che restituisce MariaDB.
BINARY, VARBINARY, BLOB
RAW fino a 2000 byte, altrimenti BLOB
I byte restano byte.
PARTITION BY
una sola tabella
Le righe sono le stesse; partiziona di nuovo la tabella in Oracle se serve.
Riga del report: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
una tabella con le righe attuali
Un dump contiene solo le righe attuali.
Riga del report: system_versioning_dropped
MyISAM, MEMORY and other engines
una tabella normale
Oracle ha un solo motore di tabelle.
Riga del report: engine_dropped
views, triggers, procedures, functions and events
elencati nel report
Il loro codice è scritto nel linguaggio di MySQL, quindi vengono elencati perché tu li ricrei.
Riga del report: not_converted_objects
dumps without CREATE TABLE
tipi ricavati dai valori
Un dump fatto con --no-create-info contiene solo righe, quindi i tipi vengono dai valori.
Riga del report: no_schema
geometries in a dump without CREATE TABLE
BLOB con WKB
Il formato delle geometrie di MySQL viene riconosciuto dai valori e salvato come WKB standard.
Riga del report: geometry_inferred
_ci collations
confronto esatto
Oracle confronta il testo in modo esatto, salvo indicazione diversa.
Riga del report: case_insensitive_collation
SET NAMES utf8 from utf8mb4 tables
convertito, con un avviso
mysqldump di MySQL 5.x scrive utf8 a 3 byte per impostazione predefinita e sostituisce ogni emoji con un punto interrogativo prima che un convertitore veda il file.
Riga del report: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
letto come Latin-1 (Windows-1252)
Il latin1 di MySQL è Windows-1252, la codifica abituale di questi dump.
Riga del report: charset_guessed
sjis, cp932, gbk, big5 dumps
letto come UTF-8, con un avviso
Queste codifiche non vengono ancora decodificate.
Riga del report: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
valutate
Alcuni strumenti di dump scrivono i valori come queste chiamate; vengono letti come i valori che producono, e il WKT geografico viene convertito mettendo prima la longitudine.
other expressions in rows
NULL
Un convertitore che non esegue un database non può valutarle.
Riga del report: expression_value
DEFAULT in VALUES
il valore predefinito della colonna
Un valore predefinito letterale viene copiato nella riga.
Riga del report: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Non c'è nessun valore da copiare.
Riga del report: default_keyword_null
REPLACE and INSERT IGNORE
righe semplici
Un dump ha una riga per chiave, quindi le righe sono le stesse.
Riga del report: replace_as_insert
types IntoSQL doesn't know
CLOB
Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.
Riga del report: unknown_type
values that don't fit their column
NULL
Un dump danneggiato o scritto a mano può contenere valori che la colonna non ammette; diventano NULL così il resto si carica.
Riga del report: invalid_value_null
unreadable geometries
NULL
I byte che non sono una geometria non si possono salvare come tale.
Riga del report: bad_geometry
dumps of several databases
un unico schema, ogni tabella con il nome del suo database davanti
Lo script si carica nello schema dell'utente che lo esegue, quindi le tabelle di database diversi hanno davanti il nome del loro database.
Riga del report: databases_merged
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE, al valore raggiunto
Le sequenze di Oracle funzionano allo stesso modo.
VECTOR(n) (MariaDB 11.7+)
CLOB con i float come array JSON
Solo Oracle 23ai ha un tipo vector; un array JSON mantiene ogni float su ogni versione.
Riga del report: type_replaced
| In MariaDB | In Oracle | Riga del report |
|---|---|---|
| TINYINT(1), BOOL | NUMBER(1) con un CHECK di 0 e 1 quando ogni valore è 0 o 1, altrimenti NUMBER(3)Il BOOL di MySQL è un TINYINT(1) che può contenere qualsiasi numero da -128 a 127. Oracle prima della 23ai non ha colonne booleane, quindi una colonna di 0 e 1 è NUMBER(1) con un CHECK; una che contiene 2 o -1 mantiene i suoi numeri. | bool_kept_numeric |
| UNSIGNED integers | NUMBER abbastanza ampio per l'intervallo, con un CHECK che non sia negativoIl NUMBER di Oracle contiene qualsiasi intero delle ampiezze di MySQL; il vincolo CHECK tiene fuori i valori negativi come faceva MySQL. | |
| ZEROFILL and display widths | rimossoIl riempimento con zeri è un modo di mostrare un numero, non ne fa parte. I numeri restano; formattali quando li leggi se il riempimento conta. | zerofill_dropped |
| FLOAT(M,D) | BINARY_FLOAT o BINARY_DOUBLE, senza la scalaI float binari di Oracle non hanno una scala fissa. I valori salvati vengono copiati così come sono. | float_scale_dropped |
| DECIMAL(p,s) | NUMBER(p,s) fino a 38 cifre; VARCHAR2 oltreIl NUMBER di Oracle contiene 38 cifre. I decimali più ampi restano come testo, così ogni cifra resta esatta. | decimal_as_text |
| BIT(1), BIT(n) | NUMBER(1), NUMBER(19) fino a 63 bit, NUMBER(20) per BIT(64)I campi di bit vengono salvati come il numero formato dai loro bit. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLOracle salva solo date reali del calendario. MySQL conserva date zero e impossibili quando la sua modalità SQL lo consente; diventano NULL e il report le conta. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL, stringhe vuote incluse, non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| empty strings and empty binary values | NULLOracle salva una stringa vuota come NULL, quindi un valore che era ' si rilegge come NULL. Il report li conta per colonna. | empty_string_null |
| DEFAULT '0000-00-00' | nessun valore predefinitoUn valore predefinito che Oracle non può salvare viene omesso invece di essere sostituito con una data inventata. | zero_date_default |
| TIME | INTERVAL DAY TO SECOND, che contiene durateOracle non ha un tipo ora del giorno, e il TIME di MySQL è una durata da -838:59:59 a 838:59:59; un intervallo contiene ogni valore. | |
| YEAR | NUMBER(4) con un CHECK del suo intervalloOracle non ha un tipo anno; il vincolo CHECK mantiene gli stessi valori che MySQL consente. | |
| CHAR(n), VARCHAR(n) | VARCHAR2(n CHAR), contando i caratteriLe lunghezze contano i caratteri come in MySQL, e MySQL restituisce i valori CHAR senza spazi finali, come li mantiene VARCHAR2. | |
| VARCHAR(n) and TEXT longer than 4000 bytes | CLOBUn VARCHAR2 contiene 4000 byte per impostazione predefinita, quindi il testo più lungo è un CLOB; una colonna i cui valori ci stanno tutti mantiene VARCHAR2. | text_as_lob |
| DATETIME | TIMESTAMPUn DATETIME è l'ora letta su un orologio, senza fuso orario, come TIMESTAMP. DATE diventa il DATE di Oracle, che contiene anche un'ora del giorno che resta a mezzanotte. | |
| TIMESTAMP | TIMESTAMP WITH TIME ZONE nel fuso indicato dal dump, UTC se non ne indica unoUn TIMESTAMP è un istante. I dump indicano il fuso in cui lo hanno scritto (mysqldump scrive UTC); senza questa indicazione, i valori vengono letti come UTC e il report lo dice. | timestamp_zone_assumed |
| ENUM | VARCHAR2 con un CHECK dei suoi valoriIl testo con un vincolo CHECK mantiene gli stessi valori. | |
| ENUM holding '' (MySQL's error value) | NULLMySQL salva una stringa vuota quando un valore non valido entra in un ENUM con una modalità SQL permissiva. Oracle la salva come NULL, che il vincolo CHECK ammette, e il report la conta con gli altri valori vuoti. | |
| ENUM holding values outside its list | nessun CHECKI valori che la lista non nomina violerebbero il vincolo CHECK, quindi il vincolo non viene creato. | enum_check_skipped |
| SET | VARCHAR2 come lo scrive MySQL ('a,b')Oracle non ha un tipo set; il testo è quello che restituisce MySQL. | |
| JSON | CLOBLe funzioni JSON di Oracle leggono il JSON dal testo su ogni versione, e un CLOB mantiene valori di qualsiasi dimensione. | |
| NUL bytes in text | mantenutoVARCHAR2 e CLOB possono contenere un carattere NUL, quindi il valore viene copiato così com'è. | |
| text that isn't valid in its character set | i byte errati come carattere di sostituzioneIl testo va letto come caratteri per essere scritto come VARCHAR2. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala. | mojibake_suspected |
| AUTO_INCREMENT | GENERATED BY DEFAULT ON NULL AS IDENTITY, riavviato oltre gli id copiatiGli id copiati si caricano così come sono, e il contatore riparte dopo il più alto o dopo l'AUTO_INCREMENT del dump, se è maggiore. | |
| MyISAM AUTO_INCREMENT on the second column of a key | un solo contatore per la tabellaMyISAM conta per gruppo della prima colonna della chiave; Oracle ha un contatore per tabella. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | un trigger BEFORE UPDATEIl trigger imposta la colonna all'ora corrente quando un aggiornamento non la imposta. | on_update_trigger |
| generated columns | colonne virtualiOracle calcola le colonne generate solo in lettura; le colonne STORED diventano virtuali con gli stessi valori. | stored_as_virtual |
| generated columns with functions Oracle lacks | una colonna sempliceUna formula che non si può scrivere per Oracle lascia una colonna semplice e una riga nel report. | generated_not_translated |
| INVISIBLE columns | colonne INVISIBLEOracle nasconde le colonne invisibili da SELECT * come fa MySQL. | |
| CHECK constraints | tradotti, dentro CREATE TABLEI CHECK nella tabella si verificano mentre ogni riga si carica. | |
| CHECK constraints with functions Oracle lacks | non creatoUn vincolo CHECK che non si può scrivere per Oracle viene omesso e segnalato. | check_skipped |
| CHECK ... NOT ENFORCED | non creatiMySQL conserva questi vincoli senza applicarli, quindi le righe possono violarli. | check_not_enforced |
| defaults with functions Oracle lacks | nessun valore predefinitoUn valore predefinito che non si può scrivere per Oracle viene omesso e segnalato. | default_not_translated |
| keys and indexes on a prefix, c(20) | un indice su SUBSTR della colonnaUn indice funzionale sullo stesso inizio della colonna tiene distinte le stesse righe, e indicizza le colonne CLOB che Oracle non può indicizzare per intero. | prefix_unique |
| FULLTEXT indexes | non creatoOracle Text gestisce la ricerca full-text con un tipo di indice e query propri. | fulltext_not_created |
| SPATIAL indexes | non creatoLe geometrie sono salvate come byte WKB, che un indice spaziale non sa leggere. | spatial_index_not_created |
| functional indexes, and indexes on whole CLOB or BLOB columns | non creatoOracle non può indicizzare per intero un oggetto di grandi dimensioni, e alcune funzioni di MySQL non hanno un equivalente in Oracle. | index_skipped |
| foreign keys | dopo i dati ENABLE NOVALIDATE, poi validata con un avviso sulle righe orfaneI dump si caricano con FOREIGN_KEY_CHECKS=0 e MyISAM non controlla mai, quindi le righe senza un genitore sono comuni. La chiave controlla subito le nuove righe e viene validata per ultima; le righe orfane la lasciano non validata con un avviso invece di fermare il caricamento. | |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | rimossoLe chiavi esterne di Oracle agiscono solo in eliminazione, con CASCADE o SET NULL. | foreign_key_action_unsupported |
| foreign keys to columns without a unique key | non creataOracle richiede una chiave primaria o un vincolo univoco sulle colonne referenziate; InnoDB no. | foreign_key_skipped |
| table and column names | maiuscolo per i nomi semplici, altrimenti come scrittiOracle salva in maiuscolo i nomi scritti senza virgolette, quindi i nomi semplici diventano maiuscoli e le query possono omettere le virgolette; gli altri nomi mantengono le maiuscole e minuscole e richiedono virgolette. | identifier_renamed |
| names over 128 bytes | accorciatoIn Oracle 12.2 e successive i nomi arrivano a 128 byte. | name_shortened |
| GEOMETRY, POINT, POLYGON... | BLOB con WKBWKB è la forma standard che ogni libreria spaziale legge; SDO_GEOMETRY richiede i metadati di Oracle Spatial. | geometry_as_blob |
| INET4, INET6, UUID (MariaDB) | VARCHAR2(39), VARCHAR2(36)Oracle non ha nessuno dei due tipi; il testo è quello che restituisce MariaDB. | |
| BINARY, VARBINARY, BLOB | RAW fino a 2000 byte, altrimenti BLOBI byte restano byte. | |
| PARTITION BY | una sola tabellaLe righe sono le stesse; partiziona di nuovo la tabella in Oracle se serve. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | una tabella con le righe attualiUn dump contiene solo le righe attuali. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | una tabella normaleOracle ha un solo motore di tabelle. | engine_dropped |
| views, triggers, procedures, functions and events | elencati nel reportIl loro codice è scritto nel linguaggio di MySQL, quindi vengono elencati perché tu li ricrei. | not_converted_objects |
| dumps without CREATE TABLE | tipi ricavati dai valoriUn dump fatto con --no-create-info contiene solo righe, quindi i tipi vengono dai valori. | no_schema |
| geometries in a dump without CREATE TABLE | BLOB con WKBIl formato delle geometrie di MySQL viene riconosciuto dai valori e salvato come WKB standard. | geometry_inferred |
| _ci collations | confronto esattoOracle confronta il testo in modo esatto, salvo indicazione diversa. | case_insensitive_collation |
| SET NAMES utf8 from utf8mb4 tables | convertito, con un avvisomysqldump di MySQL 5.x scrive utf8 a 3 byte per impostazione predefinita e sostituisce ogni emoji con un punto interrogativo prima che un convertitore veda il file. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | letto come Latin-1 (Windows-1252)Il latin1 di MySQL è Windows-1252, la codifica abituale di questi dump. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | letto come UTF-8, con un avvisoQueste codifiche non vengono ancora decodificate. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | valutateAlcuni strumenti di dump scrivono i valori come queste chiamate; vengono letti come i valori che producono, e il WKT geografico viene convertito mettendo prima la longitudine. | |
| other expressions in rows | NULLUn convertitore che non esegue un database non può valutarle. | expression_value |
| DEFAULT in VALUES | il valore predefinito della colonnaUn valore predefinito letterale viene copiato nella riga. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLNon c'è nessun valore da copiare. | default_keyword_null |
| REPLACE and INSERT IGNORE | righe sempliciUn dump ha una riga per chiave, quindi le righe sono le stesse. | replace_as_insert |
| types IntoSQL doesn't know | CLOBIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| values that don't fit their column | NULLUn dump danneggiato o scritto a mano può contenere valori che la colonna non ammette; diventano NULL così il resto si carica. | invalid_value_null |
| unreadable geometries | NULLI byte che non sono una geometria non si possono salvare come tale. | bad_geometry |
| dumps of several databases | un unico schema, ogni tabella con il nome del suo database davantiLo script si carica nello schema dell'utente che lo esegue, quindi le tabelle di database diversi hanno davanti il nome del loro database. | databases_merged |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE, al valore raggiuntoLe sequenze di Oracle funzionano allo stesso modo. | |
| VECTOR(n) (MariaDB 11.7+) | CLOB con i float come array JSONSolo Oracle 23ai ha un tipo vector; un array JSON mantiene ogni float su ogni versione. | type_replaced |
Carica lo script in Oracle
Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @mariadb.oracle.sqlLe chiavi esterne vengono aggiunte ENABLE NOVALIDATE, così le nuove righe sono controllate subito, e poi validate. Se una riga vecchia punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non validato, invece di fallire a metà.
Per un dump grande, esegui SQL*Plus sulla stessa macchina del database. Lo script fa il commit ogni 100 righe. L'utente che lo esegue ha bisogno di CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER e CREATE PROCEDURE, e di una quota sul suo tablespace.
Fai il dump di MariaDB per il miglior risultato
Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:
- --default-character-set=utf8mb4 conserva emoji e altri caratteri a 4 byte, che un dump utf8mb3 perde prima che il convertitore lo veda.
- --hex-blob scrive le colonne binarie e i valori VECTOR in esadecimale, che resiste alla copia tra sistemi diversi.
- --routines --triggers --events aggiungono quegli oggetti al dump, così il report può elencarli.
Cosa non viene convertito
Viste, trigger, stored procedure, funzioni ed eventi sono scritti nel linguaggio proprio di MariaDB. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per Oracle.
Domande sulla conversione da MariaDB a Oracle
Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti
Il mio dump viene caricato?
No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.
Quanto può essere grande il dump?
Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.
Da quali versioni di MariaDB può provenire il dump?
Dump di mariadb-dump e mysqldump su MariaDB dalla 10.3 alla 12, con un INSERT per tabella o uno per riga. Ogni dump di test viene da MariaDB 10.11, 11.4 e 11.8 ed è confrontato con la sorgente cella per cella.
Le colonne UUID, INET6, JSON e VECTOR vengono mantenute?
Le colonne UUID e INET diventano VARCHAR2, JSON CLOB e VECTOR un array JSON dei suoi float. Le date zero diventano NULL, e così le stringhe vuote, come le salva Oracle.
I valori AUTO_INCREMENT e le sequenze vengono mantenuti?
Sì. Ogni colonna AUTO_INCREMENT diventa una colonna identity che riparte dopo l'id più alto. Le sequenze diventano sequenze di Oracle, e i valori predefiniti che attingono da una continuano ad attingere da lì.
E le stored procedure e i trigger?
Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.
Su quali versioni di Oracle si carica lo script?
Oracle 19c e successive. Ogni dump di test si carica su 21c e 23ai, fermandosi al primo errore se qualcosa va storto.