Перейти к содержимому
Главная страница IntoSQL

Конвертация Oracle в SQLite

Перетащите файл .sql, который записывает Database Export в SQL Developer или SQLcl, с таблицами и командами Insert, и скачайте скрипт SQLite с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQLite не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

Ваш файл
sqlshop_2024_oracle.sqlПример файла, 9,3 кБ
Ваша база данных

18 строк конвертировано, без исправлений, ни одна не отклонена

Показать

Таблицы в shop_2024_oracle.sqlДамп Oracle · создан программой SQL Developer · utf-8

  • customers8 строк
    7 столбцов
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATETIME
    created_atDATETIME not null
  • orders10 строк
    9 столбцов
    idINTEGER not null
    customer_idINTEGER not null
    invoiceINTEGER
    statusVARCHAR(10) not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(255)
-- Written by IntoSQL from a Oracle dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATETIME,
    created_at DATETIME DEFAULT (datetime('now', 'localtime')) NOT NULL,
    CONSTRAINT customers_check1 CHECK (is_active IN (0, 1))
);

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    invoice INTEGER,
    status VARCHAR(10) DEFAULT 'pending' NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note VARCHAR(255),
    CONSTRAINT orders_check1 CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled')),
    CONSTRAINT orders_customer_fk FOREIGN KEY (customer_id) REFERENCES customers (id)
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000000');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO orders (id, customer_id, invoice, status, total, items, ordered_at, shipped_at, note) VALUES
(10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf');

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_customers_email_uk ON customers (email);
CREATE INDEX orders_orders_status_date_ix ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Исправления

Исправлять ничего не пришлось.

Требует проверки

  • Не создано последовательностей: 1; в SQLite их нет. Храните следующее значение в таблице, если оно нужно вашему приложению.
  • Значение по умолчанию столбца "invoice" таблицы orders нельзя записать для SQLite (a sequence), поэтому у столбца его нет. Добавьте значение по умолчанию вручную, если оно нужно новым строкам.

Файл конвертируется на этом компьютере и никуда не загружается.

Другие примеры:

Что меняется при переходе с Oracle на SQLite

Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.

  • BOOLEAN (23ai)

    INTEGER 0 или 1 с CHECK

    В SQLite нет логического столбца, поэтому TRUE и FALSE становятся 1 и 0.

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

    TEXT

    Длины считаются в символах, считал ли Oracle байты или символы, поэтому каждое значение помещается.

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

    INTEGER или NUMERIC, точно хранимый как текст свыше 15 цифр

    NUMBER сохраняет каждую цифру; NUMBER без точности, все значения которого - целые числа до 18 цифр, становится 64-битным целым, а отрицательный масштаб хранит столько же цифр до запятой.

    Строка отчета: decimal_as_text

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    TEXT с текстом Oracle, например +01-06

    В SQLite нет типа interval; текст сохраняет каждую часть.

    Строка отчета: type_replaced

  • DATE, TIMESTAMP(p)

    DATETIME как текст ISO 8601, со всеми цифрами

    DATE в Oracle хранит время с точностью до секунды, поэтому это дата и время. Экспорт в американском или немецком сеансе записывает даты без времени и века (DD-MON-RR); экспортируйте в сеансе ISO (SYYYY-MM-DD HH24:MI:SS), чтобы их сохранить.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    TIMESTAMP как текст ISO 8601 в UTC

    В SQLite нет типа, который хранит смещение, поэтому каждый момент записывается в UTC: тот же момент, какое бы смещение у него ни было.

    Строка отчета: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    TEXT

    Те же значения JSON; SQL NULL, который экспорт записал как 'null', остается NULL.

  • BLOB, RAW(n), LONG RAW

    BLOB

    Байты остаются байтами.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    TEXT

    У собственных типов Oracle нет аналогов; их значения сохраняют свой текст, включая значения ROWID, хотя вне Oracle они ничего не значат.

    Строка отчета: type_replaced

  • collations that ignore case (BINARY_CI)

    точное сравнение

    SQLite сравнивает текст точно, если не указано иное, а его NOCASE приводит к одному регистру только буквы ASCII.

    Строка отчета: case_insensitive_collation

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

    INTEGER PRIMARY KEY AUTOINCREMENT, продолжается после наибольшего id

    Скопированные id загружаются как есть, а счетчик продолжается после наибольшего. Столбец, который триггер заполняет из последовательности (способ до 12c), тоже становится столбцом identity.

  • identity columns the target can't count

    INTEGER без счетчика

    SQLite нумерует только столбец, который составляет весь первичный ключ, поэтому столбец сохраняет свои значения, а новым строкам нужны свои.

    Строка отчета: counter_dropped

  • CREATE SEQUENCE

    не создается

    Экспорт записывает, до какого значения дошла последовательность, как ее START WITH, поэтому она продолжается оттуда.

    Строка отчета: sequence_not_converted

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

    GENERATED ALWAYS AS, STORED при PERSISTED, иначе VIRTUAL

    SQLite вычисляет их по той же формуле; значения, которые экспорт для них записал, опускаются.

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

    обычный столбец

    Формула, которую нельзя записать для SQLite, оставляет обычный столбец и строку в отчете; значения, которые экспорт записал для виртуальных столбцов, опускаются, и SQLite не может их вычислить.

    Строка отчета: generated_not_translated

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

    без значения по умолчанию

    Значение по умолчанию, которое нельзя записать, опускается и попадает в отчет.

    Строка отчета: default_not_translated

  • CHECK constraints

    переводится

    Те же проверки, применяемые при загрузке каждой строки.

  • CHECK constraints with functions IntoSQL doesn't write

    не создается

    Проверка, которую нельзя записать, опускается и попадает в отчет.

    Строка отчета: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    не создается

    Oracle не применяет эти проверки к уже существующим строкам, поэтому строки могут их нарушать.

    Строка отчета: check_not_enforced

  • function-based, bitmap and domain indexes

    не создается

    IntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки.

    Строка отчета: index_skipped

  • foreign keys

    в CREATE TABLE, загрузка без проверки, затем список через PRAGMA foreign_key_check

    SQLite принимает внешние ключи только в CREATE TABLE и проверяет их только при включенном PRAGMA foreign_keys. Строки загружаются без проверки, а в конце скрипт перечисляет все строки без родителя.

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

    не создается

    Ключ не может ссылаться на таблицу, которой нет, а у ключа, который Oracle не проверяет, могут быть строки без родителя.

    Строка отчета: foreign_key_skipped

  • partitioned tables

    одна таблица со строками всех секций

    Строки те же; при необходимости заново секционируйте таблицу в SQLite.

    Строка отчета: partitions_dropped

  • several schemas in one export

    один файл, имя таблицы начинается с имени ее схемы

    Файл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковыми именами; экспорт одной схемы сохраняет имена своих таблиц.

    Строка отчета: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL снимается

    Столбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.

    Строка отчета: not_null_relaxed

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

    перечисляются в отчете

    Их код написан на PL/SQL, поэтому они перечислены, чтобы вы создали их заново.

    Строка отчета: not_converted_objects

  • exports without CREATE TABLE (data only)

    типы определяются по значениям

    Экспорт только с данными содержит лишь строки, поэтому типы берутся из значений.

    Строка отчета: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Конвертер, который не запускает базу данных, не может их вычислить; to_date, to_timestamp, TO_CLOB, HEXTORAW и другие функции, которые пишут экспорты, читаются.

    Строка отчета: expression_value

  • types IntoSQL doesn't know, and object types

    TEXT

    Тип text вмещает любое значение; измените тип после загрузки.

    Строка отчета: unknown_type

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

    NULL

    Значение, которое не является датой, становится NULL, и отчет его подсчитывает.

    Строка отчета: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    Infinity как 9e999; NaN как NULL

    SQLite читает 9e999 обратно как бесконечность, а NaN не поддерживает.

  • NUL characters in text

    сохраняется

    Текст в SQLite может содержать символ NUL, поэтому значение копируется как есть.

  • text that isn't valid in its encoding

    неверные байты заменяются символом замены

    Скрипт в UTF-8, и каждое значение должно быть корректным текстом.

    Строка отчета: invalid_utf8_replaced

  • text decoded twice (ñ)

    копируется как есть

    Скрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.

    Строка отчета: mojibake_suspected

В OracleВ SQLiteСтрока отчета
BOOLEAN (23ai)INTEGER 0 или 1 с CHECKВ SQLite нет логического столбца, поэтому TRUE и FALSE становятся 1 и 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGTEXTДлины считаются в символах, считал ли Oracle байты или символы, поэтому каждое значение помещается.
NUMBER, NUMBER(p,s), FLOAT(b)INTEGER или NUMERIC, точно хранимый как текст свыше 15 цифрNUMBER сохраняет каждую цифру; NUMBER без точности, все значения которого - целые числа до 18 цифр, становится 64-битным целым, а отрицательный масштаб хранит столько же цифр до запятой.decimal_as_text
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDTEXT с текстом Oracle, например +01-06В SQLite нет типа interval; текст сохраняет каждую часть.type_replaced
DATE, TIMESTAMP(p)DATETIME как текст ISO 8601, со всеми цифрамиDATE в Oracle хранит время с точностью до секунды, поэтому это дата и время. Экспорт в американском или немецком сеансе записывает даты без времени и века (DD-MON-RR); экспортируйте в сеансе ISO (SYYYY-MM-DD HH24:MI:SS), чтобы их сохранить.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP как текст ISO 8601 в UTCВ SQLite нет типа, который хранит смещение, поэтому каждый момент записывается в UTC: тот же момент, какое бы смещение у него ни было.moments_as_utc
JSON (21c), and CLOB holding JSONTEXTТе же значения JSON; SQL NULL, который экспорт записал как 'null', остается NULL.
BLOB, RAW(n), LONG RAWBLOBБайты остаются байтами.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYTEXTУ собственных типов Oracle нет аналогов; их значения сохраняют свой текст, включая значения ROWID, хотя вне Oracle они ничего не значат.type_replaced
collations that ignore case (BINARY_CI)точное сравнениеSQLite сравнивает текст точно, если не указано иное, а его NOCASE приводит к одному регистру только буквы ASCII.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsINTEGER PRIMARY KEY AUTOINCREMENT, продолжается после наибольшего idСкопированные id загружаются как есть, а счетчик продолжается после наибольшего. Столбец, который триггер заполняет из последовательности (способ до 12c), тоже становится столбцом identity.
identity columns the target can't countINTEGER без счетчикаSQLite нумерует только столбец, который составляет весь первичный ключ, поэтому столбец сохраняет свои значения, а новым строкам нужны свои.counter_dropped
CREATE SEQUENCEне создаетсяЭкспорт записывает, до какого значения дошла последовательность, как ее START WITH, поэтому она продолжается оттуда.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)GENERATED ALWAYS AS, STORED при PERSISTED, иначе VIRTUALSQLite вычисляет их по той же формуле; значения, которые экспорт для них записал, опускаются.
virtual columns with functions IntoSQL doesn't write, and the || operatorобычный столбецФормула, которую нельзя записать для SQLite, оставляет обычный столбец и строку в отчете; значения, которые экспорт записал для виртуальных столбцов, опускаются, и SQLite не может их вычислить.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)без значения по умолчаниюЗначение по умолчанию, которое нельзя записать, опускается и попадает в отчет.default_not_translated
CHECK constraintsпереводитсяТе же проверки, применяемые при загрузке каждой строки.
CHECK constraints with functions IntoSQL doesn't writeне создаетсяПроверка, которую нельзя записать, опускается и попадает в отчет.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEне создаетсяOracle не применяет эти проверки к уже существующим строкам, поэтому строки могут их нарушать.check_not_enforced
function-based, bitmap and domain indexesне создаетсяIntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки.index_skipped
foreign keysв CREATE TABLE, загрузка без проверки, затем список через PRAGMA foreign_key_checkSQLite принимает внешние ключи только в CREATE TABLE и проверяет их только при включенном PRAGMA foreign_keys. Строки загружаются без проверки, а в конце скрипт перечисляет все строки без родителя.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesне создаетсяКлюч не может ссылаться на таблицу, которой нет, а у ключа, который Oracle не проверяет, могут быть строки без родителя.foreign_key_skipped
partitioned tablesодна таблица со строками всех секцийСтроки те же; при необходимости заново секционируйте таблицу в SQLite.partitions_dropped
several schemas in one exportодин файл, имя таблицы начинается с имени ее схемыФайл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковыми именами; экспорт одной схемы сохраняет имена своих таблиц.schemas_merged
NOT NULL columns with values that become NULLNOT NULL снимаетсяСтолбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersперечисляются в отчетеИх код написан на PL/SQL, поэтому они перечислены, чтобы вы создали их заново.not_converted_objects
exports without CREATE TABLE (data only)типы определяются по значениямЭкспорт только с данными содержит лишь строки, поэтому типы берутся из значений.no_schema
expressions in INSERT values other than the ones exports writeNULLКонвертер, который не запускает базу данных, не может их вычислить; to_date, to_timestamp, TO_CLOB, HEXTORAW и другие функции, которые пишут экспорты, читаются.expression_value
types IntoSQL doesn't know, and object typesTEXTТип text вмещает любое значение; измените тип после загрузки.unknown_type
dates before year 1 and time zones given as region namesNULLЗначение, которое не является датой, становится NULL, и отчет его подсчитывает.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLEInfinity как 9e999; NaN как NULLSQLite читает 9e999 обратно как бесконечность, а NaN не поддерживает.
NUL characters in textсохраняетсяТекст в SQLite может содержать символ NUL, поэтому значение копируется как есть.
text that isn't valid in its encodingневерные байты заменяются символом заменыСкрипт в UTF-8, и каждое значение должно быть корректным текстом.invalid_utf8_replaced
text decoded twice (ñ)копируется как естьСкрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.mojibake_suspected

Загрузите скрипт в SQLite

Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.

sqlite3 -bail mydb.sqlite < oracle.sqlite.sql

Внешние ключи объявляются в каждой таблице, а строки загружаются с отключенной проверкой внешних ключей. Затем скрипт перечисляет все строки, которые ссылаются на несуществующие строки, а не прерывается на полпути.

Большой дамп загружайте в новый файл на локальном диске. Скрипт загружает все в одной транзакции с отключенной синхронизацией, поэтому работает со скоростью диска, а прерванная загрузка не оставляет неполных таблиц.

Командная строка загружает файл прямо в базу SQLite, без написания скрипта. Это бесплатно.

Как создать дамп Oracle для лучшего результата

Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:

  • В SQL Developer выберите Tools, Database Export, с DDL и форматом данных Insert. SQLcl записывает то же самое с SET SQLFORMAT INSERT.
  • Выполните ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' перед экспортом: формат по умолчанию записывает даты без времени и века.
  • Файл .dmp из exp или expdp двоичный: импортируйте его в базу Oracle, например в Oracle Database Free в Docker, и экспортируйте через SQL Developer.

Что не конвертируется

Представления, пакеты, процедуры, функции, триггеры, типы и синонимы написаны на PL/SQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для SQLite.

Вопросы о Oracle в SQLite

Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов

Мой дамп загружается на сервер?

Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.

Насколько большим может быть дамп?

Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.

Можно ли конвертировать файл .dmp из exp или expdp?

Не напрямую: Data Pump и исходный Export пишут двоичный формат, который читает только Oracle. Импортируйте его в любую базу Oracle (Oracle Database Free работает в Docker) и экспортируйте через Database Export в SQL Developer или SQLcl. Конвертер сообщает об этом, когда получает файл .dmp.

Из каких версий Oracle может быть экспорт?

Экспорты из SQL Developer и SQLcl с определениями таблиц из DBMS_METADATA, из Oracle 11g и новее. Каждый тестовый экспорт создан в Oracle 21c и 23ai, в американском, немецком и ISO-сеансах, и сверен с источником ячейка за ячейкой.

Что происходит с NUMBER, DATE и другими типами Oracle?

NUMBER становится INTEGER для целых чисел и иначе сохраняет каждую цифру; DATE становится текстом DATETIME со временем; CLOB - TEXT, BLOB и RAW - BLOB. Infinity сохраняется; NaN становится NULL.

Сохраняются ли столбцы identity и последовательности?

Столбец identity, который составляет весь первичный ключ таблицы, становится INTEGER PRIMARY KEY AUTOINCREMENT и продолжается после наибольшего id. В SQLite нет последовательностей, поэтому они попадают в отчет.

А пакеты, процедуры и триггеры PL/SQL?

Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.

На каких версиях SQLite загружается скрипт?

SQLite 3.31 и новее. Каждый тестовый экспорт загружается на 3.31 и 3.54 и останавливается на первой ошибке, если что-то пойдет не так.