連載
» 2004年04月20日 00時00分 UPDATE

エンタープライズ市場に向かうMySQL 5.0(後編):MySQL 5.0のストアドプロシージャをチェック (1/3)

MySQL 5.0最大の目玉はストアドプロシージャである。インストールした5.0を使って、ストアドプロシージャの動作を試してみよう。(編集局)

[鶴長鎮一,MySQLユーザ会]

ストアドプロシージャを使ってみよう

 MySQL 5.0最大の目玉は、何といってもストアドプロシージャです。この動作を実際に確かめてみましょう。

 例として、以下のサンプルテーブルを用意します。

# mysql -u root
mysql> use test
Database changed
mysql> desc REGION;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| NO    | int(11)     |      | PRI | NULL    | auto_increment |
| AREA  | varchar(50) |      | MUL |         |                |
| PREF  | varchar(50) |      | MUL |         |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.03 sec)
mysql> select * from REGION;
+----+----------+----------+
| NO | AREA     | PREF     |
+----+----------+----------+
|  1 | 北海道   | 北海道   |
|  2 | 東北地方 | 福島県   |
(省略)
| 47 | 沖縄諸島 | 沖縄県   |
+----+----------+----------+
47 rows in set (0.00 sec)

 第1フィールドにID、第2フィールドに地域名、第3フィールドに県名を格納します。皆さんも実際に試せるように、テーブルを作成するregion.sqlファイルを用意しました。ダウンロードしてご利用ください。

 データベースは、インストール時に作成されるtestを利用します。

# mysql -u root test < region.sql

最も簡単な例

 最初に、最も簡単な例を見ていきましょう。

mysql> delimiter // (1)
mysql> CREATE PROCEDURE simpleproc1() (2)
    -> BEGIN
    ->   SELECT AREA,PREF FROM REGION;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
注:上記の作業をスクリプト化したsimpleproc1.sqlを用意しました。

 SQLクエリーの最後は「;」を付けますが、ストアドプロシージャを記述する場合、スクリプト中のセンテンスの終了にも「;」を使用するため、区別のためにデリミタ(SQLクエリーの区切り文字)を(1)のようにして変更します。例では「//」としましたが、「|」など、任意の文字で構いません。

 (2)でストアドプロシージャを記述します。例では、ストアドプロシージャ「simpleproc1」を作成しています。ストアドプロシージャの記述については特に言及しません。ストアドプロシージャについては、以下を参照してください。

参考:
▼MySQL社「Stored Procedures and Functions」
http://www.mysql.com/doc/en/Stored_Procedures.html
▼連載:SQL実践講座(19)〜(23)
http://www.atmarkit.co.jp/fnetwork/rensai/sql19/sql1.html

 simpleproc1は、引数も戻り値もない、最もシンプルな例です。(3)のように呼び出すことで、SELECT AREA,PREF FROM REGIONが実行されます。この際、SQLクエリーの終端が「//」に変更されていることをお忘れなく。クエリーは、(4)のようにして実行します。

mysql> CALL simpleproc1() (3)
    -> // (4)
+----------+----------+
| AREA     | PREF     |
+----------+----------+
| 北海道   | 北海道   |
| 東北地方 | 福島県   |
| 東北地方 | 青森県   |
| 東北地方 | 秋田県   |
| 東北地方 | 山形県   |
| 東北地方 | 宮城県   |
| 東北地方 | 岩手県   |
(省略)

戻り値を伴う例

 次に戻り値を伴う例を見てみましょう。先ほどの例では、CALLされた時点でSELECT AREA,PREF FROM REGIONが実行されましたが、今度はCALLで結果を変数に渡し、SELECTで変数の値を引き出します。

mysql> CREATE PROCEDURE simpleproc2(OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM REGION; (1)
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)
注:上記の作業をスクリプト化したsimpleproc2.sqlを用意しました。

 (1)で、SELECT * INTOクエリーを使用しています。MySQLはSELECT …… INTO TABLEクエリーに対応しておらず、INSERT INTO …… TABLEクエリーを代わりに使用しますが、格納先が変数の場合はSELECT …… INTO 変数クエリーが使用可能です。ここでは、REGIONテーブルの総レコード数を変数param1に引き渡しています。

mysql> CALL simpleproc2(@a) (2)
    -> //
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a (3)
    -> //
+------+
| @a   |
+------+
| 47   |
+------+
1 row in set (0.00 sec)

 (2)でCALLLを実行する際は、戻り値を受け取るローカル変数を指定します。こうすることで、ストアドプロシージャの結果が変数@aに格納されます。@aの値を引き出すには、(3)のようにSELECTクエリーを用います。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。