MariaDB 11.4 では、多くの高度な機能が導入されました。私の注目を集めたのは、ストアド ルーチンのパッケージの一般的なサポートです。以前は、Oracle 互換モードを有効にすることでこの機能を使用できましたが、現在は、すぐに使用できる状態で一般に使用できます。これにより、MariaDB 環境内でのデータベース開発の組織を大幅に強化できます。
パッケージは、データベース ロジックを管理するためのモジュール アプローチを提供します。この追加により、MariaDB は、Oracle などのパッケージを長年使用してきた他の高度なデータベース システムとより密接に連携するようになり、その点で、パッケージをサポートしない他のオープン ソース リレーショナル データベースとは一線を画すものになります。
MariaDB のパッケージを使用すると、関連するストアド プロシージャ、関数、変数、およびその他の要素を 1 つのユニットにグループ化できます。この構造により、コード構成の改善、再利用性の向上、メンテナンスの簡素化など、さまざまな利点が得られます。
この更新の前は、MariaDB 内の各ストアド プロシージャと関数は独立して存在していたため、データベースに実装するとスキーマが乱雑になり、複雑なビジネス ロジックの管理が複雑になる可能性がありました。
パッケージは、関連するルーチンを論理的にグループ化する方法を提供することでこの問題に対処します。
繰り返しになりますが、パッケージを使用する主な利点は、関連するルーチンをカプセル化することです。たとえば、電子商取引アプリケーションでは、注文処理に関連する操作を1つのパッケージにグループ化できます。 OrderProcessing
このパッケージには次のような手順が含まれる場合があります。 PlaceOrder
、 CancelOrder
、 そして UpdateOrderStatus
、および次のような機能があります GetOrderDetails
。
この論理的なグループ化により、データベース スキーマがより整理され、コードベースのナビゲートと保守が容易になります。
パッケージの作成
MariaDB 11.4以降ではパッケージの作成と使用は簡単です。 CREATE PACKAGE
パッケージを定義するステートメントと CREATE PACKAGE BODY
パッケージのルーチンを実装するためのステートメント。実際のビジネス ロジック実装のない簡略化された例を次に示します。
DELIMITER $$
CREATE OR REPLACE PACKAGE OrderProcessing
PROCEDURE PlaceOrder(customer_id INT, product_id INT, quantity INT);
PROCEDURE CancelOrder(order_id INT);
FUNCTION GetOrderDetails(order_id INT) RETURNS JSON;
END;
CREATE OR REPLACE PACKAGE BODY OrderProcessing
PROCEDURE PlaceOrder(customer_id INT, product_id INT, quantity INT)
BEGIN
-- Implementation code here
END;
PROCEDURE CancelOrder(order_id INT)
BEGIN
-- Implementation code here
END;
FUNCTION GetOrderDetails(order_id INT) RETURNS JSON
BEGIN
-- Implementation code here
END;
END;
$$
DELIMITER ;
この例では、 OrderProcessing
パッケージは、2 つのプロシージャと 1 つの関数で定義されます。パッケージ本体は、これらのルーチンの実装を提供し、注文処理に関連するロジックを 1 つのパッケージ内にカプセル化します。
パッケージ化されたストアドルーチンの呼び出し
パッケージ内で定義されたプロシージャや関数を呼び出すには、「ドット表記法」を使用します。以下は、 CancelOrder
手順 OrderProcessing
パッケージ:
CALL OrderProcessing.CancelOrder(7);
パッケージ内の関数にも同じことが当てはまります。
SELECT OrderProcessing.GetOrderDetails(7);
パッケージ内のすべてのルーチンからアクセスできるパッケージ レベルの変数と定数を定義することもできます。これにより、グローバル変数に頼ったり、ルーチン間でパラメータを渡したりすることなく、共通データを共有できます。パッケージ内の共有データを一元管理することで、コードの重複を減らし、エラーのリスクを最小限に抑えることができます。次に例を示します (このコード スニペットの変数名をあまり真剣に受け止めないでください)。
DELIMITER $$
CREATE OR REPLACE PACKAGE OrderProcessing
-- procedure list (see previous example)
END;
CREATE OR REPLACE PACKAGE BODY OrderProcessing
-- variable declarations
DECLARE some_count INT DEFAULT 1;
DECLARE some_total INT DEFAULT 0;
-- procedure definitions (see previous example)
END;
$$
DELIMITER ;
パッケージのその他の特典
MariaDB 11.4 でのパッケージの導入により、バージョン管理とコードのモジュール化も改善される可能性があります。保存されたルーチンをより効率的に管理できるようになり、変更や更新の追跡が容易になります。このモジュール化は、複数の開発者がデータベース ロジックのさまざまな部分を同時に作業する可能性がある大規模プロジェクトで特に役立ちます。
さまざまな機能をパッケージに分離することで、競合や重複を最小限に抑えることができ、開発プロセスがスムーズになります。
さらに、パッケージは前方宣言をサポートしているため、ルーチンを実際の実装前に定義できます。この機能により、開発者は最初にパッケージ インターフェイスの概要を示し、その後詳細を記入できる、より柔軟で構造化されたコーディング アプローチが可能になります。
インターフェースと実装を分離することで、よりクリーンで理解しやすいコードが作成され、コラボレーションが促進され、プロジェクトに参加する新しい開発者の学習曲線が短縮されます。
Oracle データベースでの作業に慣れている開発者にとって、MariaDB 11.4 にパッケージが組み込まれることは、親しみやすく歓迎されることでしょう。これにより、MariaDB と Oracle 間の機能ギャップが埋められ、これらのプラットフォーム間の移行が容易になります。
パッケージと複数のスキーマ
パッケージと、単に複数のデータベース スキーマを使用することの違いに注意することが重要です。複数のスキーマはデータベースのさまざまな部分を分離するのに役立ちますが、パッケージと同じレベルの組織化とカプセル化は提供されません。スキーマは、データとロジックの異なる領域を分割するのに役立ちますが、モジュール性と保守性を高める方法で関連する手順と関数を本質的にグループ化するものではありません。
一方、パッケージを使用すると、より細分化された統合的なアプローチが可能になり、関連するロジックを同じスキーマ内にグループ化できます。これにより、ルーチンの管理が簡素化されるだけでなく、コードの明確さと保守性も向上します。
やってみて
いつものように、MariaDB は進化し続けています。最新バージョンの MariaDB をダウンロードして今すぐお試しください。または、Docker を実行している場合は、次の手順に従ってください。
docker run --name mariadb-11.4 -e MARIADB_ROOT_PASSWORD=my-secret-pw -e MARIADB_DATABASE=mydb -e MARIADB_USER=myuser -e MARIADB_PASSWORD=mypassword -d mariadb:11.4
docker exec -it mariadb-11.4 mariadb -p"mypassword"