SQLite - Oracle dönüştürme
Bir SQLite veritabanı dosyasını (.db, .sqlite, .sqlite3) veya sqlite3'ün .dump komutunun yazdığı SQL'i bırakın ve aynı tablolar, anahtarlar, indeksler ve verilerle bir Oracle betiği indirin. Her sütun, değerlerinin sığdığı türü alır ve Oracle'in olduğu gibi tutamadığı her değer raporda listelenir.
18 satır dönüştürüldü, düzeltme yok, reddedilen yok
shop_2024_sqlite.sql içindeki tablolarSQLite dökümü · sqlite3 ile yazıldı · utf-8
customersCUSTOMERS olarak yazıldı8 satır
7 sütun ID NUMBER(19) not null NAME VARCHAR2(4000 CHAR) not null EMAIL VARCHAR2(750 CHAR) not null COUNTRY VARCHAR2(4000 CHAR) not null IS_ACTIVE NUMBER(1) not null SIGNED_UP DATE CREATED_AT TIMESTAMP(0) not null ordersORDERS olarak yazıldı10 satır
9 sütun ID NUMBER(19) not null CUSTOMER_ID NUMBER(19) not null STATUS VARCHAR2(750 CHAR) not null TOTAL NUMBER(10,2) not null ITEMS NUMBER(10) not null ORDERED_AT TIMESTAMP(0) not null SHIPPED_AT TIMESTAMP(0) NOTE VARCHAR2(4000 CHAR) RECEIPT BLOB
Dönüştürülmedi
- Görünüm order_totals
- Tetikleyici orders_shipped
Her veritabanı bunları kendi dilinde yazar. Bunları Oracle için yeniden yazın.
-- 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;
Düzeltmeler
Düzeltilecek bir şey yoktu.
Kontrol edilmeli
- Kaynakta 1 metin sütunu büyük/küçük harf ayırmadan karşılaştırıyor; Oracle tam karşılaştırır, bu yüzden benzersiz anahtarlar ve aramalar farklı davranabilir. Gereken sütunlarda büyük/küçük harf duyarsız bir harmanlama veya sütun türü kullanın.
- 2 görünüm, tetikleyici, rutin veya olay dönüştürülmedi; rapor her birini listeliyor. Bunları Oracle'de elle yeniden oluşturun.
Dosyan bu bilgisayarda dönüştürülür ve asla yüklenmez.
Diğer örnekler:
SQLite ile Oracle arasında neler değişir
Her satır, dönüştürücünün uyguladığı bir kuraldır; yanında, kural verilerinizde bir şeyi değiştirdiğinde yazılan rapor satırı yer alır.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
sütundaki her değerin sığdığı tür
SQLite her sütunda her değeri tutar, bu yüzden tanımlanan tür bir ipucudur: her sütun, tüm değerlerinin sığdığı türü alır ve karışık değerler içeren bir sütun bunların metnini korur.
BOOLEAN, BOOL
0 ve 1'i denetleyen bir CHECK ile NUMBER(1)
Her değer 0 veya 1 olduğunda; başka değerler de içeren bir sütun bunları sayı veya metin olarak korur.
TEXT, VARCHAR(n), CHAR(n), CLOB
her değer sığıyorsa VARCHAR2(n CHAR), değilse CLOB
SQLite uzunluğu hiçbir zaman zorunlu tutmaz; tanımlanan uzunluk yalnızca her değer ona sığıyorsa korunur.
TEXT and VARCHAR(n) longer than 4000 bytes
her değer 4000 bayta sığıyorsa (anahtarda 750 karakter) VARCHAR2(4000 CHAR), değilse CLOB
Bir VARCHAR2 varsayılan olarak 4000 bayt tutar ve Oracle bir CLOB'u indeksleyemez; bu yüzden metin, değerleri sığıyorsa VARCHAR2 olarak kalır, sığmıyorsa CLOB olur.
Rapor satırı: text_as_lob
DECIMAL(p,s), NUMERIC
her değer sığıyorsa tam tür, değilse double
SQLite bunları tam sayı veya double olarak saklar; tanımlanan duyarlılık yalnızca değerler ona sığıyorsa korunur.
BLOB, and columns holding bytes
BLOB
Baytlar bayt olarak kalır; aynı sütundaki metin ve sayılar baytları olarak korunur.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
değerlerin içeriğine göre DATE veya TIMESTAMP(p)
Her değer bir tarih veya tarih ve saat olduğunda; epoch sayıları ve diğer metinler değerlerini olduğu gibi korur.
JSON holding JSON text
CLOB
Her değer bir JSON nesnesi veya dizisi olduğunda.
Infinity in REAL columns
BINARY_DOUBLE_INFINITY olarak korunur
Oracle'ın double türü sonsuzluğu tutar.
INTEGER PRIMARY KEY, AUTOINCREMENT
en yüksek id'den veya sqlite_sequence değerinden sonra devam eden GENERATED BY DEFAULT ON NULL AS IDENTITY
Yalnızca tam olarak INTEGER PRIMARY KEY olarak tanımlanan sütun rowid'dir; her satır kendi id'sini korur ve sayaç, şimdiye kadar verilmiş en yüksek id'den sonra başlar.
COLLATE NOCASE
tam karşılaştırma
Oracle, aksi belirtilmedikçe metni tam olarak karşılaştırır; NOCASE sütunları büyük/küçük harfi yok saymayı kaybeder.
Rapor satırı: case_insensitive_collation
generated columns
sanal sütunlar
Oracle üretilen sütunları yalnızca okurken hesaplar; STORED sütunlar aynı değerlerle sanal olur.
Rapor satırı: stored_as_virtual
generated columns with functions IntoSQL doesn't write, and the || operator
düz bir sütun
Yazılamayan bir formül düz bir sütun ve raporda bir satır bırakır; dökümde üretilen sütunlar için değer yoktur.
Rapor satırı: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
varsayılan değer yok
Yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır; CURRENT_TIMESTAMP ve datetime('now') yazılır.
Rapor satırı: default_not_translated
CHECK constraints
çevrilir
Aynı CHECK kısıtları, her satır yüklenirken denetlenir.
CHECK constraints with functions IntoSQL doesn't write
oluşturulmaz
Yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.
Rapor satırı: check_skipped
partial and expression indexes
oluşturulmaz
IntoSQL tüm sütunlar üzerinde indeks yazar; diğerlerini yüklemeden sonra yeniden oluşturun.
Rapor satırı: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
veriden sonra ENABLE NOVALIDATE, ardından doğrulanır
SQLite yabancı anahtarları yalnızca istendiğinde denetler, bu yüzden üst satırı olmayan satırlar yaygındır: yüklenirler ve anahtar, yüklemeyi durdurmak yerine bir uyarıyla denetlenmeden bırakılır.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT
kaldırılır
Oracle'ın yabancı anahtarları yalnızca silmede, CASCADE veya SET NULL ile işlem yapar.
Rapor satırı: foreign_key_action_unsupported
empty strings and empty blobs
NULL
Oracle boş bir dizeyi NULL olarak saklar, bu yüzden ' olan bir değer NULL olarak okunur. Rapor bunları sütun başına sayar.
Rapor satırı: empty_string_null
foreign keys to tables the dump doesn't create
oluşturulmaz
Bir anahtar, var olmayan bir tabloya başvuramaz.
Rapor satırı: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL kaldırılır
SQLite, rowid dışındaki bir birincil anahtarın NULL tutmasına izin verir; sütun hedefte NOT NULL olamaz, yoksa yükleme durur.
Rapor satırı: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
raporda listelenir
Kodları SQLite'ın kendi dilinde yazılır ve sanal tablolar SQLite'ın modüllerine ihtiyaç duyar; yeniden oluşturabilmeniz için listelenirler. İç tabloları kopyalanmaz.
Rapor satırı: not_converted_objects
dumps without CREATE TABLE (--data-only)
değerlerden okunan türler
Yalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir ve sütunlar numaralandırılır.
Rapor satırı: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr(), replace(), char() ve || kabuğun yazdığı biçimde hesaplanır; diğer ifadeler veritabanı olmadan hesaplanamaz.
Rapor satırı: expression_value
NUL characters in text
korunur
sqlite3 kabuğu ve Python, döküm alırken metni bir NUL karakterinde keser, bu yüzden dökümde yalnızca ondan önceki kısım bulunur.
text that isn't valid UTF-8
hatalı baytlar yerine koyma karakteri olarak
Dökümler bu tür metni ham bayt olarak yazar; betik UTF-8'dir.
Rapor satırı: invalid_utf8_replaced
text decoded twice (ñ)
olduğu gibi kopyalanır
Döküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.
Rapor satırı: mojibake_suspected
| SQLite içinde | Oracle içinde | Rapor satırı |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | sütundaki her değerin sığdığı türSQLite her sütunda her değeri tutar, bu yüzden tanımlanan tür bir ipucudur: her sütun, tüm değerlerinin sığdığı türü alır ve karışık değerler içeren bir sütun bunların metnini korur. | |
| BOOLEAN, BOOL | 0 ve 1'i denetleyen bir CHECK ile NUMBER(1)Her değer 0 veya 1 olduğunda; başka değerler de içeren bir sütun bunları sayı veya metin olarak korur. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | her değer sığıyorsa VARCHAR2(n CHAR), değilse CLOBSQLite uzunluğu hiçbir zaman zorunlu tutmaz; tanımlanan uzunluk yalnızca her değer ona sığıyorsa korunur. | |
| TEXT and VARCHAR(n) longer than 4000 bytes | her değer 4000 bayta sığıyorsa (anahtarda 750 karakter) VARCHAR2(4000 CHAR), değilse CLOBBir VARCHAR2 varsayılan olarak 4000 bayt tutar ve Oracle bir CLOB'u indeksleyemez; bu yüzden metin, değerleri sığıyorsa VARCHAR2 olarak kalır, sığmıyorsa CLOB olur. | text_as_lob |
| DECIMAL(p,s), NUMERIC | her değer sığıyorsa tam tür, değilse doubleSQLite bunları tam sayı veya double olarak saklar; tanımlanan duyarlılık yalnızca değerler ona sığıyorsa korunur. | |
| BLOB, and columns holding bytes | BLOBBaytlar bayt olarak kalır; aynı sütundaki metin ve sayılar baytları olarak korunur. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | değerlerin içeriğine göre DATE veya TIMESTAMP(p)Her değer bir tarih veya tarih ve saat olduğunda; epoch sayıları ve diğer metinler değerlerini olduğu gibi korur. | |
| JSON holding JSON text | CLOBHer değer bir JSON nesnesi veya dizisi olduğunda. | |
| Infinity in REAL columns | BINARY_DOUBLE_INFINITY olarak korunurOracle'ın double türü sonsuzluğu tutar. | |
| INTEGER PRIMARY KEY, AUTOINCREMENT | en yüksek id'den veya sqlite_sequence değerinden sonra devam eden GENERATED BY DEFAULT ON NULL AS IDENTITYYalnızca tam olarak INTEGER PRIMARY KEY olarak tanımlanan sütun rowid'dir; her satır kendi id'sini korur ve sayaç, şimdiye kadar verilmiş en yüksek id'den sonra başlar. | |
| COLLATE NOCASE | tam karşılaştırmaOracle, aksi belirtilmedikçe metni tam olarak karşılaştırır; NOCASE sütunları büyük/küçük harfi yok saymayı kaybeder. | case_insensitive_collation |
| generated columns | sanal sütunlarOracle üretilen sütunları yalnızca okurken hesaplar; STORED sütunlar aynı değerlerle sanal olur. | stored_as_virtual |
| generated columns with functions IntoSQL doesn't write, and the || operator | düz bir sütunYazılamayan bir formül düz bir sütun ve raporda bir satır bırakır; dökümde üretilen sütunlar için değer yoktur. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | varsayılan değer yokYazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır; CURRENT_TIMESTAMP ve datetime('now') yazılır. | default_not_translated |
| CHECK constraints | çevrilirAynı CHECK kısıtları, her satır yüklenirken denetlenir. | |
| CHECK constraints with functions IntoSQL doesn't write | oluşturulmazYazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır. | check_skipped |
| partial and expression indexes | oluşturulmazIntoSQL tüm sütunlar üzerinde indeks yazar; diğerlerini yüklemeden sonra yeniden oluşturun. | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | veriden sonra ENABLE NOVALIDATE, ardından doğrulanırSQLite yabancı anahtarları yalnızca istendiğinde denetler, bu yüzden üst satırı olmayan satırlar yaygındır: yüklenirler ve anahtar, yüklemeyi durdurmak yerine bir uyarıyla denetlenmeden bırakılır. | |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | kaldırılırOracle'ın yabancı anahtarları yalnızca silmede, CASCADE veya SET NULL ile işlem yapar. | foreign_key_action_unsupported |
| empty strings and empty blobs | NULLOracle boş bir dizeyi NULL olarak saklar, bu yüzden ' olan bir değer NULL olarak okunur. Rapor bunları sütun başına sayar. | empty_string_null |
| foreign keys to tables the dump doesn't create | oluşturulmazBir anahtar, var olmayan bir tabloya başvuramaz. | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL kaldırılırSQLite, rowid dışındaki bir birincil anahtarın NULL tutmasına izin verir; sütun hedefte NOT NULL olamaz, yoksa yükleme durur. | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | raporda listelenirKodları SQLite'ın kendi dilinde yazılır ve sanal tablolar SQLite'ın modüllerine ihtiyaç duyar; yeniden oluşturabilmeniz için listelenirler. İç tabloları kopyalanmaz. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | değerlerden okunan türlerYalnızca veri içeren bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir ve sütunlar numaralandırılır. | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr(), replace(), char() ve || kabuğun yazdığı biçimde hesaplanır; diğer ifadeler veritabanı olmadan hesaplanamaz. | expression_value |
| NUL characters in text | korunursqlite3 kabuğu ve Python, döküm alırken metni bir NUL karakterinde keser, bu yüzden dökümde yalnızca ondan önceki kısım bulunur. | |
| text that isn't valid UTF-8 | hatalı baytlar yerine koyma karakteri olarakDökümler bu tür metni ham bayt olarak yazar; betik UTF-8'dir. | invalid_utf8_replaced |
| text decoded twice (ñ) | olduğu gibi kopyalanırDöküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir. | mojibake_suspected |
Betiği Oracle veritabanına yükleyin
Betik tabloları oluşturur, satırları kopyalar, ardından anahtarları, indeksleri ve yabancı anahtarları ekler; böylece hızlı yüklenir ve ilk hatada durur.
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @sqlite.oracle.sqlYabancı anahtarlar ENABLE NOVALIDATE ile eklenir, böylece yeni satırlar hemen denetlenir, ardından doğrulanır. Eski bir satır var olmayan bir satıra işaret ediyorsa betik, yarı yolda başarısız olmak yerine hangi kısıt olduğunu söyler ve onu doğrulanmamış bırakır.
Büyük bir döküm için SQL*Plus'ı veritabanıyla aynı makinede çalıştırın. Betik her 100 satırda bir commit yapar. Betiği çalıştıran kullanıcının CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER ve CREATE PROCEDURE yetkilerine ve tablo alanında kotaya ihtiyacı vardır.
En iyi sonuç için SQLite dökümü nasıl alınır
Dönüştürücü, dökümün içerdiğini okur. Bu seçenekler verilerinizin daha fazlasını dökümde tutar:
- Veritabanı dosyasının kendisi olduğu gibi dönüştürülür ve tarayıcınızda sayfa sayfa okunur. Hiçbir değişiklik -wal dosyasında kalmasın diye önce ona yazan uygulamayı kapatın.
- sqlite3 app.db .dump > app.sql aynı veritabanını SQL olarak yazar; bu da .sql veya .sql.gz olarak dönüştürülür.
- DB Browser for SQLite bu SQL'i File, Export, Database to SQL file ile yazar; Python'ın iterdump() fonksiyonu da öyle.
Neler dönüştürülmez
Görünümler ve tetikleyiciler SQLite'in kendi dilinde yazılır. Raporda adlarıyla listelenirler, asla sessizce atlanmazlar; böylece onları Oracle için yeniden yazabilirsiniz. FTS5 ve R*Tree gibi sanal tablolar da listelenir ve bunların gölge tabloları dışarıda bırakılır.
SQLite - Oracle dönüştürme hakkında sorular
Yanıtınızı bulamadınız mı? İletişim sayfasından bize yazın, bir kişi yanıt verir. İletişim sayfası
Dökümüm yükleniyor mu?
Hayır. Dönüştürücü tarayıcınızda çalışır ve dökümü diskinizden parça parça okur; böylece döküm bilgisayarınızdan hiç çıkmaz. Masaüstü uygulaması ve komut satırı da bilgisayarınızda dönüştürür.
Döküm ne kadar büyük olabilir?
Dönüştürücü dökümün tamamını asla bellekte tutmaz: dosyayı aralıklar halinde iki kez okur ve betiği ilerledikçe yazar. Birkaç gigabaytlık dökümler tarayıcıda, masaüstü uygulamasında ve komut satırıyla dönüştürülür.
.db dosyasının kendisini dönüştürebilir miyim?
Evet. .db, .sqlite veya .sqlite3 dosyasını bırakın: tarayıcınızda okunur ve asla yüklenmez. NUL karakterli metinler ve bir double değerin her basamağı saklandığı gibi gelir; bir .dump bunları kesebilir.
Döküm hangi SQLite sürümlerinden gelebilir?
SQLite 3.0 ve sonrasından UTF-8 veya UTF-16 veritabanı dosyaları ile sqlite3 kabuğunun .dump komutundan veya Python'ın iterdump() fonksiyonundan alınan dökümler. Her test dosyası ve dökümü, STRICT ve WITHOUT ROWID tabloları dahil, sqlite3 3.31 ile 3.54 arasından gelir ve kaynağıyla hücre hücre karşılaştırılır.
SQLite sütun türlerini zorunlu tutmadığında türler nasıl belirlenir?
Tanımlanan tür bir ipucudur, kararı değerler verir: her değer sığıyorsa sütun NUMBER, BINARY_DOUBLE, DATE, TIMESTAMP, BLOB, VARCHAR2 veya CLOB olur. Boş dizeler, Oracle'in sakladığı gibi NULL olur ve rapor onları sayar.
INTEGER PRIMARY KEY ve AUTOINCREMENT korunuyor mu?
Evet. INTEGER PRIMARY KEY bir kimlik sütunu olur, her satır kendi id'sini korur ve sonraki id en yüksek id'den sonra, AUTOINCREMENT varsa sqlite_sequence değerinden sonra devam eder.
Görünümler ve tetikleyiciler ne olur?
Raporda adlarıyla listelenirler ve dönüştürülmezler, çünkü her veritabanı onları kendi dilinde yazar.
Betik hangi Oracle sürümlerinde yüklenir?
Oracle 19c ve sonrası. Her test dökümü 21c ve 23ai üzerinde yüklenir ve bir sorun çıkarsa ilk hatada durur.