MySQLストアドプロシージャで階乗を計算する方法【再帰呼び出しの実装例】
MySQLでは、ストアドプロシージャを活用することで、階乗のような再帰的な計算処理を実現できます。この記事では、再帰呼び出しを使った階乗計算のストアドプロシージャの作成方法と実行例を詳しく解説します。
階乗とは
階乗(factorial)とは、1からnまでの整数をすべて掛け合わせた値のことです。例えば、5の階乗は「5 × 4 × 3 × 2 × 1 = 120」となります。数学的には「n!」と表記されます。
実装の全体像
今回作成するのは、以下の2つのプロシージャです。
- get_factorial:エントリーポイントとなるプロシージャ。再帰深度の設定を行い、実際の計算用プロシージャを呼び出します。
- factorial_recursive:再帰的に自分自身を呼び出して階乗を計算する本体となるプロシージャ。
手順1:再帰深度の設定について
MySQLのストアドプロシージャはデフォルトでは再帰呼び出しが許可されていません。そのため、システム変数 max_sp_recursion_depth を明示的に設定する必要があります。今回は255に設定していますが、必要に応じて調整してください。
手順2:メインプロシージャの作成
mysql> DELIMITER //
mysql> CREATE PROCEDURE get_factorial(IN N INT)
-> BEGIN
-> SET @@GLOBAL.max_sp_recursion_depth = 255;
-> SET @@session.max_sp_recursion_depth = 255;
->
-> CALL factorial_recursive (N, @factorial);
->
-> SELECT @factorial;
-> END //
このプロシージャでは、まずグローバルおよびセッションレベルで再帰深度を255に設定し、続いて再帰計算用のプロシージャに引数Nを渡して呼び出します。結果はユーザー変数 @factorial に格納され、最後にSELECT文で表示されます。
手順3:再帰計算用プロシージャの作成
mysql> DELIMITER //
mysql> CREATE PROCEDURE factorial_recursive(IN N INT, OUT factorial INT)
-> BEGIN
-> IF N = 1 THEN
-> SET factorial := 1;
-> ELSE
-> CALL factorial_recursive (N-1, factorial);
-> SET factorial := N * factorial;
-> END IF;
-> END //
このプロシージャが階乗計算の中核です。引数Nが1になった時点で再帰を終了し、それ以外の場合は自分自身を「N-1」で再帰的に呼び出した後、現在のNを掛け合わせていく仕組みです。
手順4:区切り文字を元に戻す
mysql> DELIMITER ;
プロシージャの作成が完了したら、DELIMITERを通常のセミコロンに戻しておきましょう。
実行例と動作確認
それでは、実際にプロシージャを実行してみます。
10の階乗を計算する場合
mysql> CALL get_factorial(10); +--------------+ | @factorial | +--------------+ | 3628800 | +--------------+ 1 row in set (0.11 sec)
10! = 3,628,800 という正しい結果が得られました。
5の階乗を計算する場合
mysql> CALL get_factorial(5); +-------------+ | @factorial | +-------------+ | 120 | +-------------+ 1 row in set (0.00 sec)
こちらも 5! = 120 という期待通りの結果です。
注意点
- データ型の制限:OUTパラメータをINT型として定義しているため、13以上の階乗を計算するとINT型の最大値(約21億)を超え、オーバーフローが発生します。大きな数値を扱う場合はBIGINT型を使用しましょう。
- パフォーマンス:再帰呼び出しは処理負荷が高いため、頻繁に呼び出す場合は事前に再帰深度を適切に設定しておくことをおすすめします。
- 再帰深度の上限:
max_sp_recursion_depthの最大値は255です。それ以上の深さの再帰はできません。
まとめ
MySQLのストアドプロシージャと再帰呼び出しを組み合わせることで、階乗のような反復的な数学的計算もデータベース側で完結できます。再帰深度の設定やデータ型の選択など、いくつか注意すべきポイントはありますが、基本的な構造を理解すれば応用範囲は広いでしょう。
-
MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法
MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。サンプルテーブルの作成まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO
-
SHOW CREATE FUNCTIONでMySQLストアド関数のソースコード(定義)を確認する方法
MySQLでは、SHOW CREATE FUNCTIONステートメントを使用することで、特定のストアド関数の定義(ソースコード)を簡単に確認できます。このステートメントを実行すると、関数名、作成時のSQLモード、CREATE FUNCTION文そのもの、さらには文字セットや照合順序などの情報が一覧形式で出力されます。基本構文SHOW CREATE FUNCTION 関数名;末尾に\Gを付けて実行すると、結果が縦方向に整形されて表示されるため、長い定義でも読みやすくなります。実行例:Hello()関数のソースコードを表示するここでは、あらかじめ作成しておいた「Hello()」というストアド関数の