Конвертация Oracle в SQLite
Перетащите файл .sql, который записывает Database Export в SQL Developer или SQLcl, с таблицами и командами Insert, и скачайте скрипт SQLite с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQLite не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.
18 строк конвертировано, без исправлений, ни одна не отклонена
Таблицы в shop_2024_oracle.sqlДамп Oracle · создан программой SQL Developer · utf-8
customers8 строк
7 столбцов id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATETIME created_at DATETIME not null orders10 строк
9 столбцов id INTEGER not null customer_id INTEGER not null invoice INTEGER status VARCHAR(10) not null total DECIMAL(10,2) not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note VARCHAR(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, 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, иначе 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 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 как 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 и останавливается на первой ошибке, если что-то пойдет не так.