概要
MySQLデータベースでストアドプロシージャを実行したら、以下のエラーが発生しました。
ERROR 1456 (HY000) at line 1: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine TestProcedure01
原因と解決方法
Recursive limit 0
は再帰呼び出しの制限を示しています。
(ERROR 1456
は再帰呼び出しの制限に関連するエラーらしい)
再帰?と思って該当のプロシージャをよく見ると、以下がエラーの原因でした。
-- 次のプロシージャを呼び出す
CALL TestProcedure01();
TestProcedure01
が終わったらTestProcedure02
を呼び出すようにしていたのですが、誤って、ここを自身のプロシージャ名にしていました...。つまり、自身を再帰的に呼び出していたことが原因でこのエラーが発生したのです。
ということで、上記を修正したらエラーは無くなりました。
備考
大量のテーブルを一つのプロシージャで削除しようとすると、大規模なトランザクションとなり、データベースに対するロックが長時間続く可能性があり、パフォーマンスに問題を引き起こすことがあるよう。
そんな時、プロシージャを複数のステップに分割すると良い(もちろん、CPU、メモリ、ストレージなどのスペックにもよる)。