Oracle を MariaDB に変換
SQL Developer の Database Export または SQLcl が書き出した、テーブルと Insert 文を含む .sql ファイルをドロップすると、同じテーブル、キー、インデックス、データを持つ MariaDB スクリプトをダウンロードできます。MariaDB がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。
18 行を変換、修正なし、却下なし
shop_2024_oracle.sql のテーブルOracle のダンプ · SQL Developer で作成 · utf-8
customers8 行
7 列 id bigint not null name varchar(100) not null email varchar(150) not null country char(2) not null is_active smallint not null signed_up datetime created_at datetime not null orders10 行
9 列 id bigint not null customer_id bigint not null invoice bigint status varchar(10) not null total decimal(10,2) not null items int not null ordered_at datetime not null shipped_at datetime note varchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: mariadb --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE SEQUENCE `invoice_numbers` START WITH 1020 MINVALUE 1 INCREMENT BY 1;
CREATE TABLE `customers` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(150) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` smallint NOT NULL DEFAULT 1,
`signed_up` datetime,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `customers_email_uk` (`email`),
CONSTRAINT `check1` CHECK (`is_active` IN (0, 1))
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`customer_id` bigint NOT NULL,
`invoice` bigint DEFAULT (nextval(`invoice_numbers`)),
`status` varchar(10) NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` int NOT NULL DEFAULT 1,
`ordered_at` datetime NOT NULL,
`shipped_at` datetime,
`note` varchar(255),
PRIMARY KEY (`id`),
KEY `orders_status_date_ix` (`status`,`ordered_at`),
CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
CONSTRAINT `orders_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
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.000000');
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.000000');
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.000000');
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.000000');
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.000000');
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.000000');
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.000000');
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.000000');
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');
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
修正
修正が必要な箇所はありませんでした。
ファイルはこのコンピューター上で変換され、アップロードされることはありません。
その他のサンプル:
Oracle から MariaDB で変わること
各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。
BOOLEAN (23ai)
tinyint(1)
MariaDB には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
1024 文字までは varchar(n)、それを超えると text 型
Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。
NUMBER, NUMBER(p,s), FLOAT(b)
decimal(p,s)、または bigint
NUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
Oracle のテキスト (+01-06 など) を持つ varchar(100)
MariaDB の TIME は 838 時間までの期間を保持できますが、年や月はありません。テキストならすべての部分を保てます。
レポートの行: type_replaced
DATE, TIMESTAMP(p)
datetime(p)
Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。
TIMESTAMP(7) to TIMESTAMP(9)
秒の小数は 6 桁、7 桁目は切り捨て
MariaDB はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。
レポートの行: fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
UTC の datetime(p)
MariaDB の TIMESTAMP は 2038 年までしか扱えないため、日時は UTC の datetime として保存します。各値のオフセットにかかわらず同じ時点です。
レポートの行: moments_as_utc
JSON (21c), and CLOB holding JSON
json
JSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。
BLOB, RAW(n), LONG RAW
binary(n)、varbinary(n)、blob 型
バイトはバイトのままです。
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
text
Oracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。
レポートの行: type_replaced
collations that ignore case (BINARY_CI)
厳密な比較 (utf8mb4_bin)
テーブルは utf8mb4_bin を使うため、Oracle で区別されていた値は一意キーでも区別されます。大文字と小文字を区別しなかった列はその動作を失います。アクセントの規則はバージョンによって異なるため、どのバージョンでも Oracle と一致する _ci 照合順序はありません。
レポートの行: case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assigns
AUTO_INCREMENT、最大の ID の後から継続
コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。
identity columns the target can't count
普通の整数
MariaDB が採番するのはテーブルごとに 1 列だけで、キーの先頭の列です。それ以外の列はカウンターなしで値を保ちます。
レポートの行: counter_dropped
CREATE SEQUENCE
同じオプションの CREATE SEQUENCE
エクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
生成列、PERSISTED なら STORED、それ以外は VIRTUAL
MariaDB は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。
virtual columns with functions IntoSQL doesn't write, and the || operator
普通の列
MariaDB 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、MariaDB が計算する値もありません。
レポートの行: 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
外部キー、FOREIGN_KEY_CHECKS=0 で読み込み
行はどの順序でも読み込め、その後はキーが新しい行をチェックします。
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones
作成しない
キーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。
レポートの行: foreign_key_skipped
partitioned tables
すべてのパーティションの行を持つ 1 つのテーブル
行は同じです。必要なら MariaDB でもう一度テーブルをパーティション分割してください。
レポートの行: partitions_dropped
several schemas in one export
1 つのデータベース、テーブル名の先頭にスキーマ名
MariaDB のスキーマはデータベースであり、1 つのデータベースに読み込むエクスポートでは作成できません。1 つのスキーマだけのエクスポートはテーブル名を保ちます。
レポートの行: 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
longtext
text はどんな値も保持できます。読み込み後に型を変更してください。
レポートの行: unknown_type
dates before year 1 and time zones given as region names
NULL
MariaDB が保存できるのは 1000 年から 9999 年までですが、Oracle は 1 年までさかのぼれます。それらの値は NULL になり、レポートで件数を示します。
レポートの行: date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE
NULL
MariaDB の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。
レポートの行: invalid_value_null
NUL characters in text
保持
値は NUL 文字をエスケープしてコピーします。
text that isn't valid in its encoding
不正なバイトを置換文字に
スクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。
レポートの行: invalid_utf8_replaced
text decoded twice (ñ)
そのままコピー
スクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。
レポートの行: mojibake_suspected
| Oracle では | MariaDB では | レポートの行 |
|---|---|---|
| BOOLEAN (23ai) | tinyint(1)MariaDB には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。 | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | 1024 文字までは varchar(n)、それを超えると text 型Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。 | |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s)、または bigintNUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。 | |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | Oracle のテキスト (+01-06 など) を持つ varchar(100)MariaDB の TIME は 838 時間までの期間を保持できますが、年や月はありません。テキストならすべての部分を保てます。 | type_replaced |
| DATE, TIMESTAMP(p) | datetime(p)Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。 | |
| TIMESTAMP(7) to TIMESTAMP(9) | 秒の小数は 6 桁、7 桁目は切り捨てMariaDB はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。 | fraction_cut |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | UTC の datetime(p)MariaDB の TIMESTAMP は 2038 年までしか扱えないため、日時は UTC の datetime として保存します。各値のオフセットにかかわらず同じ時点です。 | moments_as_utc |
| JSON (21c), and CLOB holding JSON | jsonJSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。 | |
| BLOB, RAW(n), LONG RAW | binary(n)、varbinary(n)、blob 型バイトはバイトのままです。 | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | textOracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。 | type_replaced |
| collations that ignore case (BINARY_CI) | 厳密な比較 (utf8mb4_bin)テーブルは utf8mb4_bin を使うため、Oracle で区別されていた値は一意キーでも区別されます。大文字と小文字を区別しなかった列はその動作を失います。アクセントの規則はバージョンによって異なるため、どのバージョンでも Oracle と一致する _ci 照合順序はありません。 | case_insensitive_collation |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT、最大の ID の後から継続コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。 | |
| identity columns the target can't count | 普通の整数MariaDB が採番するのはテーブルごとに 1 列だけで、キーの先頭の列です。それ以外の列はカウンターなしで値を保ちます。 | counter_dropped |
| CREATE SEQUENCE | 同じオプションの CREATE SEQUENCEエクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。 | |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | 生成列、PERSISTED なら STORED、それ以外は VIRTUALMariaDB は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。 | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | 普通の列MariaDB 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、MariaDB が計算する値もありません。 | 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 | 外部キー、FOREIGN_KEY_CHECKS=0 で読み込み行はどの順序でも読み込め、その後はキーが新しい行をチェックします。 | |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | 作成しないキーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。 | foreign_key_skipped |
| partitioned tables | すべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら MariaDB でもう一度テーブルをパーティション分割してください。 | partitions_dropped |
| several schemas in one export | 1 つのデータベース、テーブル名の先頭にスキーマ名MariaDB のスキーマはデータベースであり、1 つのデータベースに読み込むエクスポートでは作成できません。1 つのスキーマだけのエクスポートはテーブル名を保ちます。 | 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 | longtexttext はどんな値も保持できます。読み込み後に型を変更してください。 | unknown_type |
| dates before year 1 and time zones given as region names | NULLMariaDB が保存できるのは 1000 年から 9999 年までですが、Oracle は 1 年までさかのぼれます。それらの値は NULL になり、レポートで件数を示します。 | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULLMariaDB の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。 | invalid_value_null |
| NUL characters in text | 保持値は NUL 文字をエスケープしてコピーします。 | |
| text that isn't valid in its encoding | 不正なバイトを置換文字にスクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。 | invalid_utf8_replaced |
| text decoded twice (ñ) | そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。 | mojibake_suspected |
スクリプトを MariaDB に読み込む
スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。
mariadb --default-character-set=utf8mb4 mydb < oracle.mariadb.sql外部キーはダンプが宣言するとおりに作成し、mysqldump と同様に、行の読み込み中は FOREIGN_KEY_CHECKS=0 にします。
大きなダンプでは、サーバーと同じマシンでクライアントを実行し、1 行がとても大きい場合は max_allowed_packet を上げてください。
IntoSQL Pro なら、デスクトップアプリやコマンドラインからファイルを MariaDB に直接読み込めます。スクリプトを書き出す必要はありません。
Oracle を最適な方法でダンプする
コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。
- SQL Developer で Tools、Database Export を選び、DDL と Insert データ形式を指定します。SQLcl では SET SQLFORMAT INSERT で同じものを書き出せます。
- エクスポートの前に ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' を実行してください。デフォルトの形式では日付が時刻や世紀なしで書き出されます。
- exp や expdp の .dmp ファイルはバイナリです。Oracle データベース (たとえば Docker 上の Oracle Database Free) にインポートし、SQL Developer でエクスポートしてください。
変換されないもの
ビュー、パッケージ、プロシージャ、関数、トリガー、型、シノニムは PL/SQL で書かれています。黙って削除することはなく、レポートに名前で一覧するので、MariaDB 向けに書き直せます。
Oracle から MariaDB への変換に関する質問
ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ
ダンプはアップロードされますか?
いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。
ダンプはどのくらいの大きさまで扱えますか?
コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。
exp や expdp の .dmp ファイルは変換できますか?
直接はできません。Data Pump と従来の Export は Oracle だけが読めるバイナリ形式で書き出します。任意の Oracle データベース (Oracle Database Free は Docker で動きます) にインポートし、SQL Developer の Database Export または SQLcl でエクスポートしてください。.dmp ファイルを受け取ると、コンバーターがその旨を表示します。
どの Oracle バージョンのエクスポートに対応していますか?
Oracle 11g 以降から SQL Developer と SQLcl で書き出した、DBMS_METADATA のテーブル定義を含むエクスポートです。すべてのテスト用エクスポートは Oracle 21c と 23ai でアメリカ式、ドイツ式、ISO のセッションから作成し、ソースとセル単位で比較しています。
NUMBER、DATE などの Oracle の型はどうなりますか?
NUMBER は decimal に、整数なら bigint、65 桁を超えるとテキストになります。DATE は時刻を保ったまま datetime に、CLOB は longtext、BLOB は blob になり、interval は Oracle のテキストを保ちます。NaN と Infinity は NULL になり、レポートで件数を示します。
IDENTITY 列とシーケンスは保たれますか?
はい。IDENTITY 列は AUTO_INCREMENT になり、最大の ID の後から続きます。シーケンスは MariaDB のシーケンスになり、シーケンスを使うデフォルト値もそのまま使い続けます。
PL/SQL のパッケージ、プロシージャ、トリガーはどうなりますか?
データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。
スクリプトはどの MariaDB バージョンで読み込めますか?
MariaDB 10.11 以降です。すべてのテスト用エクスポートを 10.11 と 11.4 で読み込み、問題があれば最初のエラーで止まります。