Langsung ke konten
Beranda IntoSQL

Konversi SQLite ke Oracle

Letakkan file database SQLite (.db, .sqlite, .sqlite3) atau SQL yang ditulis .dump milik sqlite3, lalu unduh skrip Oracle dengan tabel, kunci, indeks, dan data yang sama. Setiap kolom mendapat tipe yang memuat nilainya, dan setiap nilai yang tidak bisa disimpan Oracle apa adanya dicantumkan di laporan.

File Anda
sqlshop_2024_sqlite.sqlFile contoh, 3,4 kB
Database Anda

18 baris dikonversi, tanpa perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024_sqlite.sqlDump SQLite · ditulis oleh sqlite3 · utf-8

  • customersditulis sebagai CUSTOMERS8 baris
    7 kolom
    IDNUMBER(19) not null
    NAMEVARCHAR2(4000 CHAR) not null
    EMAILVARCHAR2(750 CHAR) not null
    COUNTRYVARCHAR2(4000 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) not null
  • ordersditulis sebagai ORDERS10 baris
    9 kolom
    IDNUMBER(19) not null
    CUSTOMER_IDNUMBER(19) not null
    STATUSVARCHAR2(750 CHAR) not null
    TOTALNUMBER(10,2) not null
    ITEMSNUMBER(10) not null
    ORDERED_ATTIMESTAMP(0) not null
    SHIPPED_ATTIMESTAMP(0)
    NOTEVARCHAR2(4000 CHAR)
    RECEIPTBLOB

Tidak dikonversi

  • View order_totals
  • Trigger orders_shipped

Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk Oracle.

-- Written by IntoSQL from a SQLite dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
    r CLOB;
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        IF p(i) IS NOT NULL THEN
            DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
        END IF;
    END LOOP;
    RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
    r BLOB;
    piece RAW(2000);
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        piece := HEXTORAW(p(i));
        DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
    END LOOP;
    RETURN r;
END;
/

CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(19) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 9),
    "NAME" VARCHAR2(4000 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(750 CHAR) NOT NULL,
    "COUNTRY" VARCHAR2(4000 CHAR) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) DEFAULT LOCALTIMESTAMP NOT NULL,
    CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1)),
    CONSTRAINT "CHECK1" CHECK (LENGTH("COUNTRY") = 2)
);

CREATE TABLE "ORDERS" (
    "ID" NUMBER(19) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 11),
    "CUSTOMER_ID" NUMBER(19) NOT NULL,
    "STATUS" VARCHAR2(750 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(10,2) NOT NULL,
    "ITEMS" NUMBER(10) DEFAULT 1 NOT NULL,
    "ORDERED_AT" TIMESTAMP(0) NOT NULL,
    "SHIPPED_AT" TIMESTAMP(0),
    "NOTE" VARCHAR2(4000 CHAR),
    "RECEIPT" BLOB,
    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,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 10:24:00'
);
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,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 08:11:42'
);
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,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 19:05:17'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 02:40:00'
);
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'
);
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,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 09:30:00'
);
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,
DATE '2024-02-29',
TIMESTAMP '2024-02-29 23:59:59'
);
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,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 12:12:12'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
1,
1,
'shipped',
129.9,
3,
TIMESTAMP '2024-03-01 10:00:00',
TIMESTAMP '2024-03-02 16:30:00',
NULL,
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
2,
2,
'paid',
54,
1,
TIMESTAMP '2024-03-02 11:15:00',
NULL,
'Gift wrap 🎁',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
3,
1,
'cancelled',
12.5,
1,
TIMESTAMP '2024-03-03 09:45:00',
NULL,
'Customer changed their mind',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
4,
4,
'shipped',
980,
12,
TIMESTAMP '2024-03-05 02:10:00',
TIMESTAMP '2024-03-07 08:00:00',
'请小心轻放',
HEXTORAW('25504446')
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
5,
5,
'pending',
45.75,
2,
TIMESTAMP '2024-03-08 17:20:00',
NULL,
'Leave at the door;'
|| CHR(10)
|| 'ring twice',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
6,
6,
'shipped',
310.4,
5,
TIMESTAMP '2024-03-10 13:00:00',
TIMESTAMP '2024-03-11 09:00:00',
'Fragile: "glass"',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
7,
8,
'paid',
76.2,
2,
TIMESTAMP '2024-03-11 18:45:00',
NULL,
NULL,
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
8,
2,
'paid',
19.99,
1,
TIMESTAMP '2024-03-12 08:00:00',
NULL,
'Paid at the counter',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
9,
3,
'shipped',
64,
2,
TIMESTAMP '2024-03-14 15:30:00',
NULL,
'Shipping date never recorded',
NULL
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"RECEIPT"
) VALUES (
10,
7,
'paid',
1499,
1,
TIMESTAMP '2024-03-15 21:05:00',
NULL,
'C:\Users\ravi\invoice.pdf',
NULL
);
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_EMAIL" UNIQUE ("EMAIL");
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "FK_ORDERS" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ON DELETE CASCADE ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS"' || ' 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 < 9 THEN
        next_id := 9;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
    IF next_id < 11 THEN
        next_id := 11;
    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.

Perlu diperiksa

  • 1 kolom teks di sumber membandingkan tanpa membedakan huruf besar dan kecil; Oracle membandingkan secara persis, jadi kunci unik dan pencarian bisa berperilaku berbeda. Gunakan collation atau tipe kolom yang tidak membedakan huruf besar dan kecil pada kolom yang membutuhkannya.
  • 2 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di Oracle.

File Anda dikonversi di komputer ini dan tidak pernah diunggah.

Contoh lain:

Yang berubah dari SQLite ke Oracle

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

  • declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)

    tipe yang memuat setiap nilai di kolom

    SQLite menyimpan nilai apa pun di kolom mana pun, jadi tipe yang dideklarasikan hanyalah petunjuk: setiap kolom mendapat tipe yang memuat semua nilainya, dan kolom berisi nilai campuran mempertahankan teksnya.

  • BOOLEAN, BOOL

    NUMBER(1) dengan CHECK 0 dan 1

    Jika setiap nilai adalah 0 atau 1; kolom yang juga berisi nilai lain mempertahankannya sebagai angka atau teks.

  • TEXT, VARCHAR(n), CHAR(n), CLOB

    VARCHAR2(n CHAR) jika setiap nilai muat, selain itu CLOB

    SQLite tidak pernah menerapkan panjang; panjang yang dideklarasikan hanya berlaku jika setiap nilai muat di dalamnya.

  • TEXT and VARCHAR(n) longer than 4000 bytes

    VARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte (750 karakter dalam key), 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

  • DECIMAL(p,s), NUMERIC

    tipe eksak jika setiap nilai muat di dalamnya, selain itu double

    SQLite menyimpannya sebagai bilangan bulat atau double; presisi yang dideklarasikan hanya berlaku jika nilainya muat.

  • BLOB, and columns holding bytes

    BLOB

    Byte tetap byte; teks dan angka di kolom yang sama disimpan sebagai byte-nya.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    DATE atau TIMESTAMP(p), sesuai isi nilainya

    Jika setiap nilai adalah tanggal atau tanggal dan waktu; angka epoch dan teks lain mempertahankan nilainya apa adanya.

  • JSON holding JSON text

    CLOB

    Jika setiap nilai adalah objek atau array JSON.

  • Infinity in REAL columns

    dipertahankan sebagai BINARY_DOUBLE_INFINITY

    Double di Oracle dapat memuat infinity.

  • INTEGER PRIMARY KEY, AUTOINCREMENT

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

    Hanya kolom yang dideklarasikan persis INTEGER PRIMARY KEY yang menjadi rowid; setiap baris mempertahankan id-nya, dan penghitung mulai setelah id tertinggi yang pernah diberikan.

  • COLLATE NOCASE

    perbandingan persis

    Oracle membandingkan teks secara persis kecuali diminta lain; kolom NOCASE tidak lagi mengabaikan huruf besar dan kecil.

    Baris laporan: case_insensitive_collation

  • generated columns

    kolom virtual

    Oracle menghitung kolom generated hanya saat dibaca; kolom STORED menjadi virtual dengan nilai yang sama.

    Baris laporan: stored_as_virtual

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

    kolom biasa

    Rumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; dump tidak berisi nilai untuk kolom generated.

    Baris laporan: generated_not_translated

  • defaults with functions IntoSQL doesn't write (strftime, randomblob)

    tanpa default

    Default yang tidak bisa ditulis dihilangkan dan dilaporkan; CURRENT_TIMESTAMP dan datetime('now') tetap ditulis.

    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

  • partial and expression indexes

    tidak dibuat

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

    Baris laporan: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    setelah data ENABLE NOVALIDATE, lalu divalidasi

    SQLite hanya memeriksa foreign key jika diminta, jadi baris tanpa induk sering ada: baris itu dimuat, dan key dibiarkan tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.

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

    dihapus

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

    Baris laporan: foreign_key_action_unsupported

  • empty strings and empty blobs

    NULL

    Oracle menyimpan string kosong sebagai NULL, jadi nilai ' terbaca kembali sebagai NULL. Laporan menghitungnya per kolom.

    Baris laporan: empty_string_null

  • foreign keys to tables the dump doesn't create

    tidak dibuat

    Key tidak bisa merujuk ke tabel yang tidak ada.

    Baris laporan: foreign_key_skipped

  • primary keys holding NULL, and NOT NULL columns with values that become NULL

    NOT NULL dihapus

    SQLite membolehkan primary key selain rowid berisi NULL; kolom itu tidak bisa NOT NULL di tujuan, atau pemuatan akan berhenti.

    Baris laporan: not_null_relaxed

  • views, triggers and virtual tables (FTS, R*Tree)

    dicantumkan di laporan

    Kodenya ditulis dalam bahasa SQLite sendiri, dan tabel virtual membutuhkan modul SQLite; semuanya dicantumkan agar Anda bisa membuatnya ulang. Tabel internalnya tidak disalin.

    Baris laporan: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipe dibaca dari nilai

    Dump yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai dan kolomnya diberi nomor.

    Baris laporan: no_schema

  • expressions in INSERT values other than the text functions dumps write

    NULL

    unistr(), replace(), char(), dan || dievaluasi sebagaimana shell menulisnya; ekspresi lain tidak bisa dievaluasi tanpa database.

    Baris laporan: expression_value

  • NUL characters in text

    dipertahankan

    Shell sqlite3 dan Python memotong teks di karakter NUL saat membuat dump, jadi hanya bagian sebelumnya yang ada di dump.

  • text that isn't valid UTF-8

    byte yang rusak menjadi karakter pengganti

    Dump menulis teks seperti itu sebagai byte mentah; skripnya berupa UTF-8.

    Baris laporan: invalid_utf8_replaced

  • text decoded twice (ñ)

    disalin apa adanya

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

    Baris laporan: mojibake_suspected

Di SQLiteDi OracleBaris laporan
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)tipe yang memuat setiap nilai di kolomSQLite menyimpan nilai apa pun di kolom mana pun, jadi tipe yang dideklarasikan hanyalah petunjuk: setiap kolom mendapat tipe yang memuat semua nilainya, dan kolom berisi nilai campuran mempertahankan teksnya.
BOOLEAN, BOOLNUMBER(1) dengan CHECK 0 dan 1Jika setiap nilai adalah 0 atau 1; kolom yang juga berisi nilai lain mempertahankannya sebagai angka atau teks.
TEXT, VARCHAR(n), CHAR(n), CLOBVARCHAR2(n CHAR) jika setiap nilai muat, selain itu CLOBSQLite tidak pernah menerapkan panjang; panjang yang dideklarasikan hanya berlaku jika setiap nilai muat di dalamnya.
TEXT and VARCHAR(n) longer than 4000 bytesVARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte (750 karakter dalam key), 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
DECIMAL(p,s), NUMERICtipe eksak jika setiap nilai muat di dalamnya, selain itu doubleSQLite menyimpannya sebagai bilangan bulat atau double; presisi yang dideklarasikan hanya berlaku jika nilainya muat.
BLOB, and columns holding bytesBLOBByte tetap byte; teks dan angka di kolom yang sama disimpan sebagai byte-nya.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textDATE atau TIMESTAMP(p), sesuai isi nilainyaJika setiap nilai adalah tanggal atau tanggal dan waktu; angka epoch dan teks lain mempertahankan nilainya apa adanya.
JSON holding JSON textCLOBJika setiap nilai adalah objek atau array JSON.
Infinity in REAL columnsdipertahankan sebagai BINARY_DOUBLE_INFINITYDouble di Oracle dapat memuat infinity.
INTEGER PRIMARY KEY, AUTOINCREMENTGENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggi atau nilai sqlite_sequenceHanya kolom yang dideklarasikan persis INTEGER PRIMARY KEY yang menjadi rowid; setiap baris mempertahankan id-nya, dan penghitung mulai setelah id tertinggi yang pernah diberikan.
COLLATE NOCASEperbandingan persisOracle membandingkan teks secara persis kecuali diminta lain; kolom NOCASE tidak lagi mengabaikan huruf besar dan kecil.case_insensitive_collation
generated columnskolom virtualOracle menghitung kolom generated hanya saat dibaca; kolom STORED menjadi virtual dengan nilai yang sama.stored_as_virtual
generated columns with functions IntoSQL doesn't write, and the || operatorkolom biasaRumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; dump tidak berisi nilai untuk kolom generated.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)tanpa defaultDefault yang tidak bisa ditulis dihilangkan dan dilaporkan; CURRENT_TIMESTAMP dan datetime('now') tetap ditulis.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
partial and expression indexestidak dibuatIntoSQL menulis indeks pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)setelah data ENABLE NOVALIDATE, lalu divalidasiSQLite hanya memeriksa foreign key jika diminta, jadi baris tanpa induk sering ada: baris itu dimuat, dan key dibiarkan tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTdihapusForeign key di Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.foreign_key_action_unsupported
empty strings and empty blobsNULLOracle menyimpan string kosong sebagai NULL, jadi nilai ' terbaca kembali sebagai NULL. Laporan menghitungnya per kolom.empty_string_null
foreign keys to tables the dump doesn't createtidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL dihapusSQLite membolehkan primary key selain rowid berisi NULL; kolom itu tidak bisa NOT NULL di tujuan, atau pemuatan akan berhenti.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)dicantumkan di laporanKodenya ditulis dalam bahasa SQLite sendiri, dan tabel virtual membutuhkan modul SQLite; semuanya dicantumkan agar Anda bisa membuatnya ulang. Tabel internalnya tidak disalin.not_converted_objects
dumps without CREATE TABLE (--data-only)tipe dibaca dari nilaiDump yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai dan kolomnya diberi nomor.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char(), dan || dievaluasi sebagaimana shell menulisnya; ekspresi lain tidak bisa dievaluasi tanpa database.expression_value
NUL characters in textdipertahankanShell sqlite3 dan Python memotong teks di karakter NUL saat membuat dump, jadi hanya bagian sebelumnya yang ada di dump.
text that isn't valid UTF-8byte yang rusak menjadi karakter penggantiDump menulis teks seperti itu sebagai byte mentah; skripnya berupa UTF-8.invalid_utf8_replaced
text decoded twice (ñ)disalin apa adanyaDump 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 @sqlite.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 SQLite untuk hasil terbaik

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

  • File database itu sendiri dikonversi apa adanya, dibaca halaman demi halaman di browser Anda. Tutup dulu aplikasi yang menulis ke file itu, agar tidak ada perubahan yang tertinggal di file -wal-nya.
  • sqlite3 app.db .dump > app.sql menulis database yang sama sebagai SQL, yang juga bisa dikonversi, sebagai .sql atau .sql.gz.
  • DB Browser for SQLite menulis SQL itu lewat File, Export, Database to SQL file, begitu juga iterdump() di Python.

Yang tidak dikonversi

View dan trigger ditulis dalam bahasa SQLite sendiri. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk Oracle. Tabel virtual, seperti FTS5 dan R*Tree, juga dicantumkan, dan tabel bayangannya tidak disertakan.

Pertanyaan tentang SQLite ke Oracle

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 .db secara langsung?

Ya. Letakkan file .db, .sqlite, atau .sqlite3: file dibaca di browser Anda dan tidak pernah diunggah. Teks dengan karakter NUL dan setiap digit nilai double tiba persis seperti tersimpan, sesuatu yang bisa terpotong oleh .dump.

Dump dari versi SQLite mana yang bisa dipakai?

File database dari SQLite 3.0 ke atas, dalam UTF-8 atau UTF-16, serta dump dari .dump di shell sqlite3 atau dari iterdump() di Python. Setiap file dan dump uji berasal dari sqlite3 3.31 sampai 3.54, termasuk tabel STRICT dan WITHOUT ROWID, dan dibandingkan dengan sumbernya sel demi sel.

Bagaimana tipe kolom ditentukan jika SQLite tidak menerapkannya?

Tipe yang dideklarasikan hanyalah petunjuk dan nilainya yang menentukan: kolom menjadi NUMBER, BINARY_DOUBLE, DATE, TIMESTAMP, BLOB, VARCHAR2, atau CLOB jika setiap nilai muat di dalamnya. String kosong menjadi NULL, sebagaimana Oracle menyimpannya, dan laporan menghitungnya.

Apakah INTEGER PRIMARY KEY dan AUTOINCREMENT dipertahankan?

Ya. INTEGER PRIMARY KEY menjadi kolom identity, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi, atau setelah nilai sqlite_sequence dengan AUTOINCREMENT.

Bagaimana dengan view dan trigger?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.

Di versi Oracle mana skrip bisa dimuat?

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