はじめに
MySQL 5.0の新機能にストアドプロシージャとストアドファンクションというものがあります。ストアドプロシージャとは、1つ以上のSQLステートメントを1つの手続きとしてまとめ上げ、それをデータベースサーバに格納したものです。
本稿では、基本的なストアドプロシージャとストアドファンクションの作り方を示したうえで、PHPからデータベースエクステンションを利用してMySQLのストアドプロシージャとストアドファンクションを呼び出す方法を説明します。
ストアドプロシージャを使うメリット
ストアドプロシージャには、パフォーマンスを高める効果があります。理由は、事前にコンパイルでき、しかもクライアントからサーバに名前と必要なパラメータだけを送信すれば実行でき、コードを丸ごと送信しなくて済むからです。そのほか次のメリットがあります。
- 簡単に使える1つの単位として処理をまとめ上げることで複雑な操作を単純化できる
- 十分に検証されたストアドプロシージャを再利用することで、エラーの発生を抑えることができる
- 実行方法が言語や環境に依存しない。データベースサーバの側に置かれるので、呼び出すアプリケーション環境が違ってもストアドプロシージャそのものは変化しない
- データへのアクセスを制限することでデータ破壊のリスクを減らせる
- ネットワークトラフィックを削減できる。複雑なタスクを反復的に実行する場合は、データを取得して何らかのロジックを適用し、その結果に基づいて別のデータを取得するといったことが必要になるが、こうした複数ステップの処理がデータベースサーバ上で完結するため、クライアントとデータベースサーバの間で結果セットや新たなクエリを往復させなくて済む
MySQLでのストアドプロシージャの作成
MySQL 5.0になって、ようやくストアドプロシージャの機能が導入されました。この実装では、個々のストアドプロシージャまたはストアドファンクションが特定のデータベースに関連付けられます。そのため次のような性質があります。
- ストアドプロシージャ(またはストアドファンクション)を呼び出すと、データベースで自動的に
USE db_name
コマンドが実行され、ストアドプロシージャの終了までその効果が持続する - 特定のデータベースで作成できるストアドプロシージャの名前は、そのデータベース内で一意的に決まるものでなければならない。例えば、
book
データベースに関連付けられたストアドプロシージャproc
またはストアドファンクションfunc
を呼び出すには、CALL book.proc()
またはCALL book.func()
と書く - データベースを削除すると、そのデータベースに関連付けられたストアドプロシージャやストアドファンクションもすべて削除される
プロシージャまたはファンクションの定義は次の2ステップで行われます。
- プロシージャまたはファンクションの名前を定義し、そのパラメータを設定する
- プロシージャまたはファンクションの本体をステートメント
BEGIN
とEND
の間に定義する
基本的な構文は次のとおりです。
CREATE PROCEDURE procedure_name ([procedure_parameter[,...]]) routine_body
procedure_parameter
は、パラメータと方向を示す次の引数から成るリストです。
IN
:値をプロシージャに渡す。その値をプロシージャは変更できるが、プロシージャから復帰したとき、呼び出し元には変更は見えないOUT
:値をプロシージャから呼び出し元に戻す。プロシージャ内のパラメータの初期値はNULL。通常、プロシージャはこの値を変更し、プロシージャから復帰したとき呼び出し元には最終的な値が見えるINOUT
:このINOUT
パラメータを初期化するのは呼び出し元だが、プロシージャも値を変更でき、プロシージャから復帰したとき呼び出し元には最終的な値が見える
IN
、OUT
、またはINOUT
パラメータは、プロシージャでのみ使用できます。ファンクションのパラメータは常にIN
パラメータになります。