スマートスタイル TECH BLOG

データベース&クラウド技術情報

MariaDB 10.3のPL/SQLを試してみた

MariaDB 10.3のPL/SQLを試してみた

Oracle Databaseには、独自のプログラム言語としてPL/SQLが提供されています。

PL/SQLで作成されたプロシージャやファンクションは、データベース内で高速に動作するとともに、アプリケーション側から複雑なビジネスロジックを隠蔽でき、とても有用なものですが、一方Oracle Database内でしか使用できないものであったため、他データベースへの移行の際の障壁になる事もしばしばありました。

MariaDB社では、MariaDB 10.3(2018/03/30現在ではRC版)からPL/SQLの構文に対応しました。

SQL_MODE=ORACLE From MariaDB 10.3

今回は、簡単なPL/SQLを使用したプロシージャ作成し、動作検証をしてみたいと思います。

検証環境

今回は、Dockerを使用して環境を作成しました。
バージョンは以下の通りです。

DB バージョン
Oracle 12.1.0.2
MariaDB 10.3.5

お試しの際には事前にDockerのインストールをお願いします。

Dockerインストール

また、PL/SQLスクリプト配置用のscriptsディレクトリを作成しています。

MariaDB 10.3の準備

以下のコマンドでMariaDB 10.3.5のコンテナを起動します。

次にテスト接続を行います。

以上でMariaDBは利用する準備ができました。

Oracle 12.1の準備

Oracle社ではDockerはサポートしておりませんが、Docker ImageをBuildするためのスクリプトを提供しており、簡単にテスト環境を構築できます。

Oracleではデータベース構築済みのDocker Image自体は提供していないため、Oracle Databseのバイナリパッケージは入手する必要があります。

OTN Download Page

(12.1.0.2.0) – Standard Edition (SE2) の Linux x86-64 からFile 1、File 2のリンクから
以下のファイルをダウンロードしてください。

  • linuxamd64_12102_database_se2_1of2.zip
  • linuxamd64_12102_database_se2_2of2.zip

その後Oracleのgithubリポジトリをcloneします。

詳しい使用方法は同梱されている各READMEをご確認頂くとして、今回はシングルインスタンスのStandard Edition 2のOracleデータベースを手早く作成します。
先程ダウンロードしたzipファイルを以下の場所に配置します。

スクリプトを使用して、Docker ImageをBuildします。
弊社環境ではdockerのボリュームサイズチェック(checkSpace.sh)に抵触し、かつ回避できなかったため、チェックを無効にしています。

build fail “checkSpace.sh: ERROR”

Dockerイメージが配置されるパーティション(/var/lib/docker/)に12GB以上の容量があるかご確認ください。

作成されたImageを起動します
起動後、データベースの作成完了後、接続可能な状態となります。

以下のコマンドで、データベースに接続できたら準備完了です。

今回は作業の簡略化のためにSYSユーザーを使用します。

データセットの準備

kaggleからデータセットを取得します。
データセットは、kaggleのページから検索してダウンロードするか、kaggle-api 経由でダウンロードが可能です。
作成したscriptsディレクトリ配下に展開します。

Importするための前処理を行います。

それぞれのDBに以下のようにIMPORTしてください。

MariaDB

Oracle

PL/SQLのテスト

現段階では、PL/SQLの全ての構文をサポートしているわけではありません。
サポートされる構文は、Supported Syntax in Oracle Modeにリストされています。

MariaDBでPL/SQLを実行するためには、set sql_mode=Oracle;を実行する必要がありますので、プロシージャ作成前には忘れずに実行してください。

それではいくつかプロシージャを作成し、実行してみます。

簡単なプロシージャの作成

最初にORACLEで、ラーメンの一覧を表示するプロシージャを作成してみます。

動作確認をします。

正常に、評価が5以上の醤油ラーメンの一覧が表示されました。

それでは、MariaDBで同じプロシージャを作成し、試してみます。

残念ながら、DBMS_OUTPUTのようなパッケージはMariaDBには存在しないので、PUT_LINEプロシージャを作成してみます。

まずは、PACKAGEから作成しましょう。

PACKAGEができたので確認します。

次にPACKAGE BODYを作成します。

同じように確認しましょう。

それでは実行してみます。

簡易的なものですがDBMS_OUTPUT.PUT_LINEができました。

それでは、やっと目的のプロシージャを作成してみましょう。

上記には、基本的なカーソルの作成、FOR LOOP文が含まれる他、変数型にORACLEのNUMBER,VARCHAR2を使用しています。
ただし、TO_NUMBERはMariaDBに存在しないためCASTを使用しています。
また、CAST中ではNUMBER型は使用できなかったようですので、DECIMALを使用しています。
そして、これは必須ではありませんが、dbms_outputの出力結果を見やすくなるように変更しています。

それでは実行してみます。

基本的なプロシージャなら問題なく実行できるようです。

(DECLARE..)BEGIN ENDのみの構文もサポートされているので、一時的にPL/SQLを使って何かをしたい場合に役立ちます。

ダミーデータが簡単に作成できました。

所感

現段階でも、様々なPL/SQLの構文がサポートされており、ORACLEフレーバーなプロシージャやファンクションの開発が可能となっていました。
中でもBEGIN..END構文は、既存のMariaDBのファンクションを使用してよりカジュアルに手続き処理を行う事ができるようになると思います。

一方で、REF_CURSOR等対応していない構文もありますし、ORACLEに事前定義されている強力なパッケージ群はMariaDBでは使用できないというような事から、ORACLEからそのままソースコードを移行して動作するレベルではありません。

まだ本機能はベータ版ですので、今後更に機能が拡充されることを期待しましょう。


MariaDB

 

Return Top