MySQL 5.0最大の目玉はストアドプロシージャである。インストールした5.0を使って、ストアドプロシージャの動作を試してみよう。(編集局)
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)
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)
(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クエリーを用います。
Copyright © ITmedia, Inc. All Rights Reserved.