Langsung ke konten
Beranda IntoSQL

Pindahkan ekspor Oracle ke Oracle versi lebih lama atau lebih baru

Letakkan file .sql yang ditulis Database Export di SQL Developer atau SQLcl, dengan tabel dan pernyataan Insert-nya, lalu unduh skrip yang dimuat di Oracle 19c dan yang lebih baru. NUMBER, DATE, TIMESTAMP, LOB, identity, dan sequence tetap apa adanya, XMLTYPE dan JSON menyimpan teksnya di CLOB, dan setiap perubahan dicantumkan di laporan.

File Anda
sqlshop_2024_oracle.sqlFile contoh, 9,3 kB
Database Anda

18 baris dikonversi, tanpa perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024_oracle.sqlDump Oracle · ditulis oleh SQL Developer · utf-8

  • customersditulis sebagai CUSTOMERS8 baris
    7 kolom
    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
  • ordersditulis sebagai ORDERS10 baris
    9 kolom
    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;

Perbaikan

Tidak ada yang perlu diperbaiki.

File Anda dikonversi di komputer ini dan tidak pernah diunggah.

Contoh lain:

Apa yang berubah antara file dan skrip

Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.

  • BOOLEAN (23ai)

    BOOLEAN di 23ai, selain itu NUMBER(1) dengan CHECK 0 dan 1

    TRUE dan FALSE tetap true dan false.

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

    tipe yang sama, dengan panjang BYTE atau CHAR-nya

    Tipe teks yang sama; LONG menjadi CLOB, yang diutamakan setiap versi sejak 8.

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

    VARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte, selain itu CLOB

    VARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.

    Baris laporan: text_as_lob

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

    tipe NUMBER yang sama

    Tipe NUMBER dan FLOAT yang sama, dengan setiap digit.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    tipe INTERVAL yang sama

    Interval yang sama.

  • DATE, TIMESTAMP(p)

    DATE dan TIMESTAMP(p), sesuai deklarasi

    Tipe yang sama, jadi setiap tanggal mempertahankan waktunya hingga detik.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    tipe yang sama

    Oracle menyimpan offset dari -12:00 sampai +14:00; nilai dengan offset melewati -12:00 ditulis dalam UTC, momen yang sama.

  • JSON (21c), and CLOB holding JSON

    JSON di 21c ke atas, selain itu CLOB

    Nilai JSON yang sama; NULL SQL yang ditulis ekspor sebagai 'null' tetap NULL.

  • BLOB, RAW(n), LONG RAW

    tipe yang sama; LONG RAW sebagai BLOB

    Byte tetap byte.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    CLOB dengan teksnya

    XMLTYPE, ROWID, dan UROWID menyimpan teksnya dalam CLOB, jadi skrip bisa dimuat di setiap versi sejak 19c.

    Baris laporan: type_replaced

  • collations that ignore case (BINARY_CI)

    perbandingan persis

    Collation kolom tidak ditulis, jadi kolom yang mengabaikan huruf besar dan kecil (BINARY_CI) kini membedakan Ana dan ana.

    Baris laporan: case_insensitive_collation

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

    GENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggi

    Id yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi. Kolom yang diisi trigger dari sequence (cara sebelum 12c) juga menjadi identity.

  • identity columns the target can't count

    bilangan bulat biasa

    Oracle menghitung satu kolom identity per tabel; kolom lain mempertahankan nilainya tanpa penghitung.

    Baris laporan: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE dengan opsi yang sama

    Ekspor menulis posisi yang sudah dicapai sequence sebagai START WITH-nya, jadi sequence berlanjut dari sana.

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

    kolom virtual

    Kolom virtual yang sama.

    Baris laporan: stored_as_virtual

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

    kolom biasa

    Rumus yang tidak bisa ditulis untuk Oracle menyisakan kolom biasa dan satu baris laporan; nilai yang ditulis ekspor untuk kolom virtual tidak disertakan, dan Oracle tidak punya apa pun untuk dihitung.

    Baris laporan: generated_not_translated

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

    tanpa default

    Default yang tidak bisa ditulis dihilangkan dan dilaporkan.

    Baris laporan: default_not_translated

  • CHECK constraints

    diterjemahkan

    CHECK yang sama, diuji saat setiap baris dimuat.

  • CHECK constraints with functions IntoSQL doesn't write

    tidak dibuat

    CHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.

    Baris laporan: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    tidak dibuat

    Oracle tidak menerapkan CHECK ini pada baris yang sudah ada, jadi baris bisa melanggarnya.

    Baris laporan: check_not_enforced

  • function-based, bitmap and domain indexes

    tidak dibuat

    IntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.

    Baris laporan: index_skipped

  • foreign keys

    setelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris yatim

    Key langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.

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

    dihapus

    Foreign key Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.

    Baris laporan: foreign_key_action_unsupported

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

    tidak dibuat

    Key tidak bisa merujuk ke tabel yang tidak ada, dan key yang tidak diperiksa Oracle bisa punya baris tanpa induk.

    Baris laporan: foreign_key_skipped

  • names longer than Oracle 12.1 allows

    dipersingkat

    Nama di Oracle memuat 128 byte sejak 12.2; nama yang lebih panjang dipersingkat.

    Baris laporan: name_shortened

  • partitioned tables

    satu tabel dengan baris dari setiap partisi

    Barisnya sama; partisi ulang tabel di Oracle jika diperlukan.

    Baris laporan: partitions_dropped

  • several schemas in one export

    satu skema, nama tabel diawali nama skemanya

    Skrip dimuat ke schema pengguna yang menjalankannya, jadi tabel dari schema berbeda diberi nama schema-nya di depan; ekspor satu schema mempertahankan nama tabelnya.

    Baris laporan: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL dihapus

    Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.

    Baris laporan: not_null_relaxed

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

    dicantumkan di laporan

    Kodenya ditulis dalam PL/SQL, jadi dicantumkan agar Anda bisa membuatnya ulang.

    Baris laporan: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipe dibaca dari nilai

    Ekspor yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai.

    Baris laporan: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Konverter yang tidak menjalankan database tidak bisa mengevaluasinya; to_date, to_timestamp, TO_CLOB, HEXTORAW, dan fungsi lain yang ditulis ekspor tetap dibaca.

    Baris laporan: expression_value

  • types IntoSQL doesn't know, and object types

    CLOB

    Text memuat nilai apa pun; ubah tipenya setelah pemuatan.

    Baris laporan: unknown_type

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

    NULL

    Nilai yang bukan tanggal menjadi NULL dan laporan menghitungnya.

    Baris laporan: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NaN dan Infinity dipertahankan

    Tipe floating-point Oracle memuat NaN dan infinity.

  • NUL characters in text

    dipertahankan

    VARCHAR2 dan CLOB bisa memuat karakter NUL, jadi nilainya disalin apa adanya.

  • text that isn't valid in its encoding

    byte yang rusak menjadi karakter pengganti

    Skripnya UTF-8 dan setiap nilai harus berupa teks yang valid.

    Baris laporan: invalid_utf8_replaced

  • text decoded twice (ñ)

    disalin apa adanya

    Skrip berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.

    Baris laporan: mojibake_suspected

Di fileDi skripBaris laporan
BOOLEAN (23ai)BOOLEAN di 23ai, selain itu NUMBER(1) dengan CHECK 0 dan 1TRUE dan FALSE tetap true dan false.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGtipe yang sama, dengan panjang BYTE atau CHAR-nyaTipe teks yang sama; LONG menjadi CLOB, yang diutamakan setiap versi sejak 8.
VARCHAR2 and NVARCHAR2 past what the target's own types holdVARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte, selain itu CLOBVARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.text_as_lob
NUMBER, NUMBER(p,s), FLOAT(b)tipe NUMBER yang samaTipe NUMBER dan FLOAT yang sama, dengan setiap digit.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDtipe INTERVAL yang samaInterval yang sama.
DATE, TIMESTAMP(p)DATE dan TIMESTAMP(p), sesuai deklarasiTipe yang sama, jadi setiap tanggal mempertahankan waktunya hingga detik.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEtipe yang samaOracle menyimpan offset dari -12:00 sampai +14:00; nilai dengan offset melewati -12:00 ditulis dalam UTC, momen yang sama.
JSON (21c), and CLOB holding JSONJSON di 21c ke atas, selain itu CLOBNilai JSON yang sama; NULL SQL yang ditulis ekspor sebagai 'null' tetap NULL.
BLOB, RAW(n), LONG RAWtipe yang sama; LONG RAW sebagai BLOBByte tetap byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYCLOB dengan teksnyaXMLTYPE, ROWID, dan UROWID menyimpan teksnya dalam CLOB, jadi skrip bisa dimuat di setiap versi sejak 19c.type_replaced
collations that ignore case (BINARY_CI)perbandingan persisCollation kolom tidak ditulis, jadi kolom yang mengabaikan huruf besar dan kecil (BINARY_CI) kini membedakan Ana dan ana.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsGENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggiId yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi. Kolom yang diisi trigger dari sequence (cara sebelum 12c) juga menjadi identity.
identity columns the target can't countbilangan bulat biasaOracle menghitung satu kolom identity per tabel; kolom lain mempertahankan nilainya tanpa penghitung.counter_dropped
CREATE SEQUENCECREATE SEQUENCE dengan opsi yang samaEkspor menulis posisi yang sudah dicapai sequence sebagai START WITH-nya, jadi sequence berlanjut dari sana.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)kolom virtualKolom virtual yang sama.stored_as_virtual
virtual columns with functions IntoSQL doesn't write, and the || operatorkolom biasaRumus yang tidak bisa ditulis untuk Oracle menyisakan kolom biasa dan satu baris laporan; nilai yang ditulis ekspor untuk kolom virtual tidak disertakan, dan Oracle tidak punya apa pun untuk dihitung.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)tanpa defaultDefault yang tidak bisa ditulis dihilangkan dan dilaporkan.default_not_translated
CHECK constraintsditerjemahkanCHECK yang sama, diuji saat setiap baris dimuat.
CHECK constraints with functions IntoSQL doesn't writetidak dibuatCHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEtidak dibuatOracle tidak menerapkan CHECK ini pada baris yang sudah ada, jadi baris bisa melanggarnya.check_not_enforced
function-based, bitmap and domain indexestidak dibuatIntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.index_skipped
foreign keyssetelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris yatimKey langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.
ON DELETE CASCADE that cascades in a cycle or along a second pathdihapusForeign key Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.foreign_key_action_unsupported
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onestidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada, dan key yang tidak diperiksa Oracle bisa punya baris tanpa induk.foreign_key_skipped
names longer than Oracle 12.1 allowsdipersingkatNama di Oracle memuat 128 byte sejak 12.2; nama yang lebih panjang dipersingkat.name_shortened
partitioned tablessatu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel di Oracle jika diperlukan.partitions_dropped
several schemas in one exportsatu skema, nama tabel diawali nama skemanyaSkrip dimuat ke schema pengguna yang menjalankannya, jadi tabel dari schema berbeda diberi nama schema-nya di depan; ekspor satu schema mempertahankan nama tabelnya.schemas_merged
NOT NULL columns with values that become NULLNOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersdicantumkan di laporanKodenya ditulis dalam PL/SQL, jadi dicantumkan agar Anda bisa membuatnya ulang.not_converted_objects
exports without CREATE TABLE (data only)tipe dibaca dari nilaiEkspor yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai.no_schema
expressions in INSERT values other than the ones exports writeNULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya; to_date, to_timestamp, TO_CLOB, HEXTORAW, dan fungsi lain yang ditulis ekspor tetap dibaca.expression_value
types IntoSQL doesn't know, and object typesCLOBText memuat nilai apa pun; ubah tipenya setelah pemuatan.unknown_type
dates before year 1 and time zones given as region namesNULLNilai yang bukan tanggal menjadi NULL dan laporan menghitungnya.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENaN dan Infinity dipertahankanTipe floating-point Oracle memuat NaN dan infinity.
NUL characters in textdipertahankanVARCHAR2 dan CLOB bisa memuat karakter NUL, jadi nilainya disalin apa adanya.
text that isn't valid in its encodingbyte yang rusak menjadi karakter penggantiSkripnya UTF-8 dan setiap nilai harus berupa teks yang valid.invalid_utf8_replaced
text decoded twice (ñ)disalin apa adanyaSkrip berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.mojibake_suspected

Muat skrip ke Oracle

Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.

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

Foreign key ditambahkan ENABLE NOVALIDATE, jadi baris baru langsung diperiksa, lalu divalidasi. Jika baris lama merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak tervalidasi, bukan gagal di tengah jalan.

Untuk dump yang besar, jalankan SQL*Plus di mesin yang sama dengan database. Skrip melakukan commit setiap 100 baris. Pengguna yang menjalankannya memerlukan CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, dan CREATE PROCEDURE, serta kuota di tablespace-nya.

Buat dump Oracle untuk hasil terbaik

Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:

  • Di SQL Developer, pilih Tools, Database Export, dengan DDL dan format data Insert. SQLcl menulis hal yang sama dengan SET SQLFORMAT INSERT.
  • Jalankan ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' sebelum mengekspor: format default menulis tanggal tanpa jam atau abadnya.
  • File .dmp dari exp atau expdp bersifat biner: impor ke database Oracle, misalnya Oracle Database Free di Docker, lalu ekspor dengan SQL Developer.

Yang tidak dikonversi

View, trigger, procedure, fungsi, dan objek lain yang ditulis dalam bahasa Oracle sendiri dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, jadi Anda bisa memeriksa masing-masing dengan versi Oracle tujuan pemuatan sebelum membuatnya ulang.

Pertanyaan tentang memindahkan Oracle antarversi

Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak

Apakah dump saya diunggah?

Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.

Seberapa besar dump yang bisa dipakai?

Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.

Bisakah saya mengonversi file .dmp dari exp atau expdp?

Tidak secara langsung: Data Pump dan Export versi asli menulis format biner yang hanya bisa dibaca Oracle. Impor ke database Oracle mana pun, Oracle Database Free berjalan di Docker, lalu ekspor dengan Database Export di SQL Developer atau SQLcl. Konverter memberi tahu hal ini saat menerima file .dmp.

Ekspor dari versi Oracle mana yang bisa dipakai?

Ekspor dari SQL Developer dan SQLcl, dengan definisi tabel dari DBMS_METADATA, dari Oracle 11g ke atas. Setiap ekspor uji berasal dari Oracle 21c dan 23ai, dalam sesi Amerika, Jerman, dan ISO, dan dibandingkan dengan sumbernya sel demi sel.

Apa yang terjadi pada NUMBER, DATE, dan tipe Oracle lainnya?

Tetap apa adanya: NUMBER dengan presisinya, DATE, TIMESTAMP, interval, CHAR dan VARCHAR2 dengan panjangnya, RAW, dan LOB. XMLTYPE dan JSON menyimpan teksnya dalam CLOB, jadi skrip bisa dimuat di 19c.

Apakah kolom identity dan sequence dipertahankan?

Ya. Kolom identity dan sequence tetap apa adanya dan berlanjut dari posisi yang disebutkan ekspor.

Bagaimana dengan paket PL/SQL, prosedur, dan trigger?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, sehingga Anda bisa membuatnya ulang setelah tabel dimuat.

Di versi Oracle mana skrip bisa dimuat?

Oracle 19c dan yang lebih baru. Setiap ekspor uji dimuat di 21c dan 23ai, dan berhenti di galat pertama jika ada yang salah.