ストアドプロシージャ
ストアドプロシージャは、SQLコマンドの集まりであり、データベースに格納された特定の名前を持つサブプログラムと言えます。ストアドプロシージャが行う処理は、入力パラメータを受け取り、出力パラメータの形で値を呼び出し元に戻し、トリガーや他のストアドプロシージャなどのプログラムによって実行されるデータベースでのデータ操作を行うことです。ストアドプロシージャを使用する利点は以下の通りです。
- アプリケーションのパフォーマンスを向上させる。なぜなら、作成されたストアドプロシージャは、アプリケーションから送信される未コンパイルのSQLコマンドよりも高速に実行されるからです。
- データベースとアプリケーション間のネットワークトラフィックを削減する。未コンパイルのSQLを送信する必要がないからです。
- すべてのアプリケーションで繰り返し透過的に使用できる。
ただし、ストアドプロシージャの使用には欠点もあります。
- デバッグができない。
- サーバーハードウェアの負荷が増加する。
- 記述が容易ではなく、専門的な知識を必要とする。
ストアドプロシージャの構文
ストアドプロシージャにおける構文
- ストアドプロシージャを記述する構文
DELIMITER // CREATE PROCEDURE プロシージャ名() BEGIN SQLクエリ END // DELIMITER ;
- ストアドプロシージャを呼び出す構文
CALL プロシージャ名()
- ストアドプロシージャで変数を宣言する構文
DECLARE 変数名 データ型(長さ) DEFAULT 値;
- パラメータ付きストアドプロシージャの構文
パラメータには3つのモードがあります。
- IN : パラメータのデフォルトの形式で、ストアドプロシージャ内での変更はパラメータに影響しません。
- OUT : パラメータの値を変更し、呼び出し元に送り返すモードです。
- INOUT : INとOUTを組み合わせたモードです。
パラメータ付きストアドプロシージャを定義する構文の例:
DELIMITER // CREATE PROCEDURE プロシージャ名([モード] [パラメータ] [データ型]) BEGIN SQLクエリ END // DELIMITER ;パラメータ付きストアドプロシージャを呼び出す構文の例:
CALL プロシージャ名([パラメータ値])
カーソル
カーソルは、特定のSQL文の処理を格納するために使用されるデータベース上のオブジェクトであり、複数の行やレコードを含むクエリ結果を格納する変数と言えます。カーソルはテーブルの行数分だけ反復処理を行うことができます。カーソルにはいくつかの特性があります。
- 更新不可(読み取り専用)
- カーソルは一方向にのみ進む(スクロール不可)
- カーソルが参照するテーブルを更新することは望ましくない結果を生じる可能性があるため推奨されない(非感受性)
ストアドプロシージャにおけるカーソルの構文
カーソルに存在する構文
カーソルの作成にはいくつかの段階があります。
- Declare : カーソルを宣言する段階。構文は以下の通り。
DECLARE カーソル名 CURSOR FOR SELECT文;
- Open : カーソルを開く(アクティブにする)段階。構文は以下の通り。
OPEN カーソル名;
- Fetch : カーソルからデータを取得して変数に格納する段階。構文は以下の通り。
FETCH カーソル名 INTO 変数リスト
- Close : カーソルを非アクティブにする段階。構文は以下の通り。
CLOSE カーソル名
ストアドプロシージャとカーソルの違い
ストアドプロシージャとカーソルの違いは、ストアドプロシージャがMySQLの宣言コマンドのみを格納するのに対し、カーソルはクエリ結果を格納すると同時にそのクエリ結果へのポインタとして機能することです。これにより、カーソルはストアドプロシージャではできない複雑な操作(例えばレコードの反復処理)を行うことが可能になります。
m

