Naar de inhoud
IntoSQL-startpagina

Een Oracle-export verhuizen naar een oudere of nieuwere Oracle

Sleep het .sql-bestand dat Database Export van SQL Developer of SQLcl schrijft, met de tabellen en Insert-statements, hierheen en download een script dat laadt op Oracle 19c en later. NUMBER, DATE, TIMESTAMP, LOB's, identities en sequences blijven zoals ze zijn, XMLTYPE en JSON bewaren hun tekst in een CLOB, en elke wijziging staat in het rapport.

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

18 rijen geconverteerd, geen correcties, geen afgewezen

Tonen

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

  • customersgeschreven als CUSTOMERS8 rijen
    7 kolommen
    IDNUMBER(10,0) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(150 CHAR) not null
    COUNTRYCHAR(2 BYTE) not null
    IS_ACTIVENUMBER(1,0) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) not null
  • ordersgeschreven als ORDERS10 rijen
    9 kolommen
    IDNUMBER(10,0) not null
    CUSTOMER_IDNUMBER(10,0) not null
    INVOICENUMBER(10,0)
    STATUSVARCHAR2(10 CHAR) not null
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(5,0) not null
    ORDERED_ATDATE not null
    SHIPPED_ATDATE
    NOTEVARCHAR2(255 CHAR)
-- Written by IntoSQL from a Oracle 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 1020 INCREMENT BY 1 MINVALUE 1;
CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "NAME" VARCHAR2(100 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(150 CHAR) NOT NULL,
    "COUNTRY" CHAR(2 BYTE) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1,0) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) DEFAULT LOCALTIMESTAMP NOT NULL,
    CONSTRAINT "CHECK1" CHECK ("IS_ACTIVE" IN (0, 1))
);

CREATE TABLE "ORDERS" (
    "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "CUSTOMER_ID" NUMBER(10,0) NOT NULL,
    "INVOICE" NUMBER(10,0) DEFAULT ("INVOICE_NUMBERS".NEXTVAL),
    "STATUS" VARCHAR2(10 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(10,2) NOT NULL,
    "ITEMS" NUMBER(5,0) DEFAULT 1 NOT NULL,
    "ORDERED_AT" DATE NOT NULL,
    "SHIPPED_AT" DATE,
    "NOTE" VARCHAR2(255 CHAR),
    CONSTRAINT "CHECK1_2" CHECK ("STATUS" IN ('pending', 'paid', 'shipped', 'cancelled'))
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
TIMESTAMP '2023-01-15 00:00:00',
TIMESTAMP '2023-01-15 10:24:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
TIMESTAMP '2023-02-03 00:00:00',
TIMESTAMP '2023-02-03 08:11:42.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
TIMESTAMP '2023-03-21 00:00:00',
TIMESTAMP '2023-03-21 19:05:17.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
TIMESTAMP '2023-05-09 00:00:00',
TIMESTAMP '2023-05-09 02:40:00.000000000'
);
COMMIT;
END;
/
BEGIN
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.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
TIMESTAMP '2024-01-02 00:00:00',
TIMESTAMP '2024-01-02 09:30:00.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
TIMESTAMP '2024-02-29 00:00:00',
TIMESTAMP '2024-02-29 23:59:59.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
TIMESTAMP '2024-04-12 00:00:00',
TIMESTAMP '2024-04-12 12:12:12.000000000'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
1,
1,
1000,
'shipped',
129.9,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
2,
2,
1001,
'paid',
54,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
3,
1,
1002,
'cancelled',
12.5,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
4,
4,
1003,
'shipped',
980,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
5,
5,
1004,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door; ring twice'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
6,
6,
1005,
'shipped',
310.4,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
7,
8,
1006,
'paid',
76.2,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
8,
2,
1007,
'paid',
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Paid at the counter'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
9,
3,
1008,
'shipped',
64,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"INVOICE",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE"
) VALUES (
10,
7,
1009,
'paid',
1499,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf'
);
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_CUSTOMERS_EMAIL_UK" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_ORDERS_STATUS_DATE_IX" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "ORDERS_CUSTOMER_FK" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "ORDERS_CUSTOMER_FK"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"ORDERS_CUSTOMER_FK"' || ' 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 < 1 THEN
        next_id := 1;
    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 < 1 THEN
        next_id := 1;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;

Correcties

Er hoefde niets gecorrigeerd te worden.

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

Andere voorbeelden:

Wat er verandert tussen het bestand en het script

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

  • BOOLEAN (23ai)

    BOOLEAN op 23ai, anders NUMBER(1) met een CHECK op 0 en 1

    TRUE en FALSE blijven true en false.

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

    dezelfde typen, met hun BYTE- of CHAR-lengtes

    Dezelfde teksttypen; LONG wordt CLOB, waar elke versie sinds 8 de voorkeur aan geeft.

  • VARCHAR2 and NVARCHAR2 past what the target's own types hold

    VARCHAR2(4000 CHAR) als elke waarde in 4000 bytes past, anders CLOB

    Een VARCHAR2 bevat standaard 4000 bytes en Oracle kan een CLOB niet indexeren, dus tekst blijft VARCHAR2 als de waarden passen en wordt CLOB als ze dat niet doen.

    Rapportregel: text_as_lob

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

    dezelfde NUMBER-typen

    Dezelfde NUMBER- en FLOAT-typen, met elk cijfer.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    dezelfde INTERVAL-typen

    Dezelfde intervallen.

  • DATE, TIMESTAMP(p)

    DATE en TIMESTAMP(p), zoals gedeclareerd

    Dezelfde typen, dus elke datum behoudt zijn tijd tot op de seconde.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    dezelfde typen

    Oracle bewaart offsets van -12:00 tot +14:00; een waarde met een offset voorbij -12:00 wordt in UTC geschreven: hetzelfde moment.

  • JSON (21c), and CLOB holding JSON

    JSON op 21c en later, anders CLOB

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

  • BLOB, RAW(n), LONG RAW

    dezelfde typen; LONG RAW als BLOB

    Bytes blijven bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    CLOB met hun tekst

    XMLTYPE, ROWID en UROWID behouden hun tekst in een CLOB, zodat het script laadt op elke versie vanaf 19c.

    Rapportregel: type_replaced

  • collations that ignore case (BINARY_CI)

    exacte vergelijking

    Kolomcollaties worden niet geschreven, dus een kolom die hoofdletters negeerde (BINARY_CI), onderscheidt nu Ana en ana.

    Rapportregel: case_insensitive_collation

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

    GENERATED BY DEFAULT ON NULL AS IDENTITY, verdergaand na het hoogste id

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

  • identity columns the target can't count

    een geheel getal zonder teller

    Oracle telt één identity-kolom per tabel; elke andere behoudt zijn waarden zonder teller.

    Rapportregel: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE met dezelfde opties

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

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

    virtuele kolommen

    Dezelfde virtuele kolommen.

    Rapportregel: stored_as_virtual

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

    een gewone kolom

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

    Rapportregel: generated_not_translated

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

    geen standaardwaarde

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

    Rapportregel: default_not_translated

  • CHECK constraints

    vertaald

    Dezelfde checks, getest terwijl elke rij laadt.

  • CHECK constraints with functions IntoSQL doesn't write

    niet aangemaakt

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

    Rapportregel: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    niet aangemaakt

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

    Rapportregel: check_not_enforced

  • function-based, bitmap and domain indexes

    niet aangemaakt

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

    Rapportregel: index_skipped

  • foreign keys

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

    De sleutel controleert nieuwe rijen meteen en wordt als laatste gevalideerd; rijen zonder ouder laten hem ongevalideerd met een waarschuwing, in plaats van het laden te stoppen.

  • ON DELETE CASCADE that cascades in a cycle or along a second path

    weggelaten

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

    Rapportregel: foreign_key_action_unsupported

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

    niet aangemaakt

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

    Rapportregel: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    ingekort

    Namen in Oracle bevatten vanaf 12.2 128 bytes; een langere naam wordt ingekort.

    Rapportregel: name_shortened

  • partitioned tables

    één tabel met de rijen van elke partitie

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

    Rapportregel: partitions_dropped

  • several schemas in one export

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

    Het script laadt in het schema van de gebruiker die het uitvoert, dus tabellen uit verschillende schema's krijgen de naam van hun schema ervoor; een export van één schema behoudt de namen van zijn tabellen.

    Rapportregel: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL weggelaten

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

    Rapportregel: not_null_relaxed

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

    vermeld in het rapport

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

    Rapportregel: not_converted_objects

  • exports without CREATE TABLE (data only)

    typen afgeleid uit de waarden

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

    Rapportregel: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

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

    Rapportregel: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

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

    Rapportregel: unknown_type

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

    NULL

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

    Rapportregel: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN en Infinity behouden

    Drijvendekommatypen in Oracle kunnen NaN en oneindig bevatten.

  • NUL characters in text

    behouden

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

  • text that isn't valid in its encoding

    de foute bytes als het vervangingsteken

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

    Rapportregel: invalid_utf8_replaced

  • text decoded twice (ñ)

    ongewijzigd gekopieerd

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

    Rapportregel: mojibake_suspected

In het bestandIn het scriptRapportregel
BOOLEAN (23ai)BOOLEAN op 23ai, anders NUMBER(1) met een CHECK op 0 en 1TRUE en FALSE blijven true en false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGdezelfde typen, met hun BYTE- of CHAR-lengtesDezelfde teksttypen; LONG wordt CLOB, waar elke versie sinds 8 de voorkeur aan geeft.
VARCHAR2 and NVARCHAR2 past what the target's own types holdVARCHAR2(4000 CHAR) als elke waarde in 4000 bytes past, anders CLOBEen VARCHAR2 bevat standaard 4000 bytes en Oracle kan een CLOB niet indexeren, dus tekst blijft VARCHAR2 als de waarden passen en wordt CLOB als ze dat niet doen.text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)dezelfde NUMBER-typenDezelfde NUMBER- en FLOAT-typen, met elk cijfer.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDdezelfde INTERVAL-typenDezelfde intervallen.
DATE, TIMESTAMP(p)DATE en TIMESTAMP(p), zoals gedeclareerdDezelfde typen, dus elke datum behoudt zijn tijd tot op de seconde.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdezelfde typenOracle bewaart offsets van -12:00 tot +14:00; een waarde met een offset voorbij -12:00 wordt in UTC geschreven: hetzelfde moment.
JSON (21c), and CLOB holding JSONJSON op 21c en later, anders CLOBDezelfde JSON-waarden; een SQL-NULL die de export als 'null' schreef, blijft NULL.
BLOB, RAW(n), LONG RAWdezelfde typen; LONG RAW als BLOBBytes blijven bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYCLOB met hun tekstXMLTYPE, ROWID en UROWID behouden hun tekst in een CLOB, zodat het script laadt op elke versie vanaf 19c.type_replaced
collations that ignore case (BINARY_CI)exacte vergelijkingKolomcollaties worden niet geschreven, dus een kolom die hoofdletters negeerde (BINARY_CI), onderscheidt nu Ana en ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY, verdergaand na het hoogste idDe gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste. Een kolom die een trigger vult uit een sequence (de manier van voor 12c) wordt ook een identity-kolom.
identity columns the target can't counteen geheel getal zonder tellerOracle telt één identity-kolom per tabel; elke andere behoudt zijn waarden zonder teller.counter_dropped
CREATE SEQUENCECREATE SEQUENCE met dezelfde optiesDe export schrijft hoe ver een sequence is gekomen als zijn START WITH, dus hij gaat daar verder.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)virtuele kolommenDezelfde virtuele kolommen.stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operatoreen gewone kolomEen formule die niet voor Oracle kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de waarden die de export voor virtuele kolommen schreef, worden weggelaten, en Oracle kan ze niet berekenen.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)geen standaardwaardeEen standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
CHECK constraintsvertaaldDezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions IntoSQL doesn't writeniet aangemaaktEen check die niet kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEniet aangemaaktOracle past deze checks niet toe op de rijen die er al zijn, dus de rijen kunnen ze schenden.check_not_enforced
function-based, bitmap and domain indexesniet aangemaaktIntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.index_skipped
foreign keysna de data, ENABLE NOVALIDATE, daarna gevalideerd met een waarschuwing bij wezenDe sleutel controleert nieuwe rijen meteen en wordt als laatste gevalideerd; rijen zonder ouder laten hem ongevalideerd met een waarschuwing, in plaats van het laden te stoppen.
ON DELETE CASCADE that cascades in a cycle or along a second pathweggelatenRefererende sleutels in Oracle werken alleen bij verwijderen, met CASCADE of SET NULL.foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesniet aangemaaktEen sleutel kan niet verwijzen naar een tabel die er niet is, en een sleutel die Oracle niet controleert, kan rijen zonder ouder hebben.foreign_key_skipped
names longer than Oracle 12.1 allowsingekortNamen in Oracle bevatten vanaf 12.2 128 bytes; een langere naam wordt ingekort.name_shortened
partitioned tableséén tabel met de rijen van elke partitieDe rijen zijn dezelfde; partitioneer de tabel opnieuw in Oracle als dat nodig is.partitions_dropped
several schemas in one exportéén schema, tabellen met de naam van hun schema ervoorHet script laadt in het schema van de gebruiker die het uitvoert, dus tabellen uit verschillende schema's krijgen de naam van hun schema ervoor; een export van één schema behoudt de namen van zijn tabellen.schemas_merged
NOT NULL columns with values that become NULLNOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersvermeld in het rapportHun code is geschreven in PL/SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.not_converted_objects
exports without CREATE TABLE (data only)typen afgeleid uit de waardenEen export met alleen data bevat alleen rijen, dus de typen komen uit de waarden.no_schema
expressions in INSERT values other than the ones exports writeNULLEen converter die geen database draait, kan ze niet evalueren; to_date, to_timestamp, TO_CLOB, HEXTORAW en de andere die exports schrijven, worden gelezen.expression_value
types IntoSQL doesn't know, and object typesCLOBText kan elke waarde bevatten; wijzig het type na het laden.unknown_type
dates before year 1 and time zones given as region namesNULLEen waarde die geen datum is, wordt NULL en het rapport telt hem.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN en Infinity behoudenDrijvendekommatypen in Oracle kunnen NaN en oneindig bevatten.
NUL characters in textbehoudenVARCHAR2 en CLOB kunnen een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its encodingde foute bytes als het vervangingstekenHet script is UTF-8 en elke waarde moet geldige tekst zijn.invalid_utf8_replaced
text decoded twice (ñ)ongewijzigd gekopieerdHet script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.mojibake_suspected

Het script in 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 @oracle.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 Oracle maken voor het beste resultaat

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

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

Wat niet wordt geconverteerd

Weergaven, triggers, procedures, functies en andere objecten in de eigen taal van Oracle staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je elk ervan kunt controleren tegen de Oracle-versie waarin je laadt voordat je het opnieuw aanmaakt.

Vragen over Oracle verhuizen tussen versies

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

Wordt mijn dump geüpload?

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

Hoe groot mag de dump zijn?

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

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

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

Van welke Oracle-versies kan de export komen?

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

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

Ze blijven zoals ze zijn: NUMBER met zijn precisie, DATE, TIMESTAMP, intervallen, CHAR en VARCHAR2 met hun lengtes, RAW en de LOB's. XMLTYPE en JSON behouden hun tekst in een CLOB, zodat het script laadt op 19c.

Blijven identity-kolommen en sequences behouden?

Ja. Identity-kolommen en sequences blijven zoals ze zijn en gaan verder vanaf waar ze volgens de export waren gekomen.

En PL/SQL-packages, procedures en triggers?

Ze staan op naam in het rapport en worden niet geconverteerd, zodat je ze opnieuw kunt maken zodra de tabellen er zijn.

Op welke Oracle-versies laadt het script?

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