mcpField
O
oracle-to-mariadb

oracle-to-mariadb

github.com/mariadbデータ・データベース1782 回インストール2 週間前に更新
リポジトリ

oracle-to-mariadb について

oracle-to-mariadbは、OracleデータベースからMariaDBへの移行を計画または実施するチーム向けのリファレンススキルです。Oracle互換モード、データ型の対応、手動での書き換え、移行ツールとバージョンごとの注意点を説明します。

主な機能

  1. 01Oracle互換モードの説明
  2. 02OracleからMariaDBへの型対応表
  3. 03手動での書き換えが必要な構文の特定
  4. 04移行ツールとバージョン上の注意点の整理

活用シーン

  1. 01移行前のOracleスキーマ互換性評価
  2. 02未対応SQL構文の書き換え計画
  3. 03データ型とトランザクション動作の差異確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mariadb/skills --skill oracle-to-mariadb

インストール後、Claude Code で/oracle-to-mariadbを入力して読み込まれたか確認します。

詳細

Oracle から MariaDB への移行ガイド

最終更新日:2026-06-04

Oracle からの移行先として MariaDB を選ぶ理由

MariaDB は、ネイティブで PL/SQL との互換性を備えた唯一のオープンソースデータベースです。MySQL には、同等の Oracle 互換モードがありません。PostgreSQL では、PL/SQL を全面的に書き換える必要があります。MariaDB の sql_mode=ORACLE を有効にすると、ストアドプロシージャ、パッケージ、カーソル、例外処理、Oracle スタイルの関数など、Oracle コードのおよそ 80% を変更せずに実行できます。

他のオープンソースの代替製品と比べた追加の利点:

  • Connect Storage Engine — 移行中、全面的な切り替えを行わずに、ODBC 経由で Oracle のライブデータをフェデレーションできます
  • システムバージョン管理テーブル — 時系列データについて Oracle Flashback Archive に相当する機能を提供します。オープンソースデータベースでは唯一です
  • ColumnStore — Oracle の In-Memory ColumnStore に匹敵する、列指向の分析エンジンです
  • コスト:通常、Oracle のライセンスと比べて 70~90% のコスト削減を実現できます

必要条件: Oracle 互換モードには MariaDB Community Server 10.3 以降が必要です。ROWNUM、TO_CHAR()、ADD_MONTHS()、SYS_GUID() には 10.6 以降が必要です。現在の LTS は 11.8(2025 年 5 月)です。

最初の手順:Oracle 互換モードを有効にする

SET sql_mode = 'ORACLE';
-- or permanently in configuration:
-- sql_mode = ORACLE

これを行わないと、PL/SQL 構文、Oracle のデータ型の同義語、Oracle スタイルの関数は動作しません。これは最も重要な手順であり、最も見落とされやすい手順です。

LLM が誤りやすい点

よくある内容正しい内容
構文エラーになる PL/SQLまず sql_mode=ORACLE を設定してください。設定しないと、PL/SQL の構文要素は認識されません
Oracle の DATE を MariaDB の DATE にマッピングするOracle の DATE は日付と時刻の両方を格納します。DATE ではなく DATETIME にマッピングしてください
PL/SQL と 100% 互換性があると想定する約 80% は変更せずに動作しますが、通常、SYNONYM、INSERT ALL、CONNECT BY は書き換えが必要です。(+) 結合は 12.1 以降の Oracle モードで動作します(次の行を参照)
スキーマまたはコードで SYNONYM を使用するMariaDB に同等の機能はありません。ビューまたはオブジェクトへの直接参照に置き換えてください
(+) 外部結合表記MariaDB 12.1 以降の Oracle モードでサポートされています(MDEV-13817)。それより古いバージョンでは LEFT JOIN/RIGHT JOIN に書き換えてください
START WITH ... CONNECT BYサポートされていません。WITH RECURSIVE を使用した再帰 CTE に書き換えてください
TIMESTAMP WITH TIME ZONE移行時にタイムゾーン情報が失われ、DATETIME になります。アプリケーション側でタイムゾーンを処理してください

データ型のマッピング

sql_mode=ORACLE により、次の項目は自動的に処理されます。

OracleMariaDB備考
VARCHAR2(n)VARCHAR(n)自動
NUMBER(p,s)DECIMAL(p,s)自動
NUMBERDOUBLE自動
DATEDATETIME自動ですが、注意: Oracle の DATE には時刻が含まれますが、MariaDB の DATE には含まれません
CLOBLONGTEXT自動
BLOBLONGBLOB自動
RAW(n)VARBINARY(n)自動
CHAR(n > 255)VARCHAR(n)手動
TIMESTAMP WITH TIME ZONEDATETIME手動 — タイムゾーン情報が失われます
BFILELONGBLOB手動 — ファイルパスの保存方法が異なります
ROWIDCHAR(10)手動

sql_mode=ORACLE が対応する内容

PL/SQL 構文(10.3+)
  • パッケージ:CREATE PACKAGE、CREATE PACKAGE BODY — 11.4 以降は sql_mode=ORACLE の外でも動作するため(MDEV-10075)、混在モードのコードベースでもパッケージを使用できます
  • カーソル:明示的、暗黙的、パラメーター付き、%ISOPEN、%ROWCOUNT、%FOUND、%NOTFOUND
  • 準備済みステートメントのカーソル(12.3+)
  • カーソル変数:TYPE ... IS REF CURSOR(13.0+)— カーソルをプロシージャーのパラメーターとして渡し、戻り値として返せます
  • 事前定義された弱い型の SYS_REFCURSOR(12.0+)— 組み込みのカーソル型で、TYPE 宣言は不要です。システム変数 max_open_cursors により、同時に開けるカーソルの数が制限されます
  • 変数の型::= による代入、%TYPE、%ROWTYPE
  • ストアド関数の戻り値としての ROW データ型(11.7+)— 関数が構造化された行を返します。Oracle の行型に似ています
  • ルーチンのパラメーターおよび関数の RETURN 句での RECORD 型(13.0+)
  • 連想配列:DECLARE TYPE ... TABLE OF ... INDEX BY(12.1+)
  • ストアドルーチンのパラメーターにはデフォルト値を指定できます(11.8+)— Oracle の DEFAULT 句のように、引数を少なくしてプロシージャーを呼び出せます
  • 制御フロー:FOR i IN 1..10 LOOP、GOTO、EXIT WHEN、ELSIF、CONTINUE
  • 例外処理:EXCEPTION WHEN TOO_MANY_ROWS / NO_DATA_FOUND / DUP_VAL_ON_INDEX
  • 無名ブロック:BEGIN ... END
  • 動的 SQL:EXECUTE IMMEDIATE ... USING
  • トリガー変数::NEW、:OLD
Oracle 互換関数
関数利用可能なバージョン
DECODE()10.3
CHR()、位置 0 を指定した SUBSTR()10.3
ADD_MONTHS()10.6
TO_CHAR()10.6(FM のパディング抑制フォーマットは 12.0 で追加)
SYS_GUID()10.6
ROWNUM10.6
TO_NUMBER()12.2.1
TO_DATE()12.3(ネイティブ対応。それ以前のバージョンでは STR_TO_DATE() を使用)
TRUNC()12.2
NULL の処理

Oracle では空文字列を NULL として扱います。sql_mode=ORACLE ではこの動作は自動的に有効にならないため、EMPTY_STRING_IS_NULL を別途追加する必要があります。

SET sql_mode = 'ORACLE,EMPTY_STRING_IS_NULL';

EMPTY_STRING_IS_NULL がない場合、Oracle モードでも MariaDB では '' は NULL ではありません。

その他の自動動作
  • 文字列連結としての ||(NULL を無視)
  • EXCEPT の同義語としての MINUS(10.6+)
  • 準備済みステートメントでの名前付きプレースホルダー(:1、:2)
  • SELECT DISTINCT の同義語としての SELECT UNIQUE
  • DUAL テーブルのサポート

手動での書き換えが必要なもの

以下の Oracle 機能には直接相当する機能がないため、コードの変更が必要です。

  • SYNONYM — ビュー(CREATE VIEW)に置き換えるか、オブジェクト参照を直接更新します
  • INSERT ALL / INSERT FIRST — 複数の INSERT ステートメントまたはアプリケーションロジックに書き換えます
  • (+) 外部結合構文 — Oracle モードでは MariaDB 12.1 以降でネイティブにサポートされています。それ以前のバージョンでは LEFT JOIN / RIGHT JOIN に書き換えます。
    -- Oracle:
    SELECT * FROM a, b WHERE a.id = b.id(+);
    -- MariaDB:
    SELECT * FROM a LEFT JOIN b ON a.id = b.id;
    
  • START WITH ... CONNECT BY — 再帰 CTE に書き換えます。
    -- MariaDB equivalent:
    WITH RECURSIVE tree AS (
        SELECT id, parent_id, name FROM categories WHERE parent_id IS NULL
        UNION ALL
        SELECT c.id, c.parent_id, c.name FROM categories c
        JOIN tree t ON c.parent_id = t.id
    )
    SELECT * FROM tree;
    
  • TIMESTAMP WITH TIME ZONE — タイムゾーンオフセットを別の列に保存するか、アプリケーション側で処理します
  • オブジェクト型と継承 — 相当する機能はありません。正規化されたテーブルに再構成します

移行ツール

  • MariaDB Migration Assessment Tool — Oracle の DDL エクスポートを分析し、移行を開始する前に互換性を評価します
  • Connect Storage Engine — ODBC 経由で Oracle のライブデータを読み取る MariaDB テーブルを作成します。全面的な切り替えをせずに段階的に移行する場合に便利です
  • DBeaver — Oracle と MariaDB 間のスキーママッピング、データ比較、データ転送に対応します
  • MaxScale のクエリー書き換え — アプリケーション側で変更できない場合に、サポートされていない Oracle 構文をその場で傍受して書き換えます

主な注意点

  • 自動コミット(コミットモデルが逆です):Oracle には autocommit 変数がなく、デフォルトは手動コミットです。INSERT/UPDATE/DELETE は、明示的に COMMIT を実行するまで永続化されません。MariaDB は逆で、デフォルトで autocommit がONのため、各ステートメントはすぐにコミットされます。Oracle の「バッチ処理後にコミット」という動作を維持するには、作業単位を START TRANSACTION ... COMMIT で囲むか、autocommit=0 を設定してください。Oracle のトランザクションに関する概念ガイドを参照してください。
  • SYSDATE:MariaDB の Oracle モードでは SYSDATE は動作しますが、DATETIME を返します。日付のみの比較を確認してください。
  • DUAL:MariaDB でも動作しますが、完全に同じではありません。schema.DUAL のようなスキーマ修飾参照は避けてください。
  • シーケンス:MariaDB 10.3 以降では、Oracle 互換の構文(MINVALUE、MAXVALUE、INCREMENT BY)で CREATE SEQUENCE が動作します。
  • アクティブなセッションがある場合の DROP USER(12.1 以降):Oracle 互換の動作です。Oracle モードでは、ユーザーにアクティブなセッションがあると DROP USER は失敗します。他のモードでは警告が出されます。
  • 約 20%の書き換え:Oracle から MariaDB への変換を 100%実現できるツールはありません。複雑な PL/SQL、オブジェクト型、サポートされていない構文については、手動での確認を見込んでください。

参考資料

ここで取り上げていないトピックについては、mariadb.com/docs の MariaDB 公式ドキュメントを参照してください。

コメント