日本国内でMySQLのシェアが低い理由の一つに「ストアド・プロシジャをサポートしていない」ことがあると言われている。しかし,現在alphaリリースとして公開されているMySQL 5.0ではストアド・プロシジャが実装された。今回は,MySQL 5.0のストアド・プロシジャを実際に動かしてみよう。

alphaとして公開されているMySQL 5.0.0

 現時点のMySQLの安定版は,4.0.18である。このバージョンは,データの出し入れに関しては,ほぼ申し分のない機能を備えている。しかし,第1回でも紹介したように,他のデータ-ベースに比較すると機能的に見劣りする部分がある。

表1●バージョン別の機能比較

バージョン 4.0.18 4.1.1-alpha 5.0.0-alpha 5.1
位置付け 安定版 プレビュー版 新機能確認用 未公開
トランザクション OK
サブクエリー   OK
Unicodeサポート   OK
ストアド・プロシジャ     OK
HEAPテーブルの可変長対応     OK
トリガー       OK
ビュー       OK

 既に公開されているMySQL 5.0.0-alphaを使用してMySQL5.0の目玉である「HEAPテーブルの可変長対応」と「ストアド・プロシジャ」を確認してみよう。今回は,スペースの問題もあるので,MySQL 5.0.0-alphaのインストール手順は省略させていただく。

高速なHEAPテーブルが,可変長に対応

 MySQLの特色であるHEAPテーブルをご存知だろうか。HEAPテーブルは,メモリー上に展開される,高速で動作するテーブルタイプだ。明示的に削除するか,MySQLのサーバー・プロセスを停止するまで,メモリー上に保持される。

 バージョン4.1までのHEAPテーブルは,レコードが固定長のみに制限されていた。5.0では,可変長レコードが利用できる。これまでは,可変長のフィールドを利用できなかったので不便な面もあったが,制約が減ることになる。しかし,MySQL5.0でも,TEXTやBLOBなど255文字を超える文字型はサポートしていない。

リスト1●HEAPタイプのテーブルの作成例(コマンドモード)


mysql> CREATE TABLE sample (no INT, name VARCHAR(50),
 memo VARCHAR(255)) TYPE=HEAP; 
Query OK, 0 rows affected, 1 warning (0.02 sec) 

mysql>
DESC sample; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type         | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| no    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(50)  | YES  |     | NULL    |       |
| memo  | varchar(255) | YES  |     | NULL    |       | 
+-------+--------------+------+-----+---------+-------+ 
3 rows in set (0.01 sec)

ストアド・プロシジャを作成,実行する

 やはり,MySQL 5.0の目玉は,ストアド・プロシジャのサポートだろう。実際に使用してみると,サーバー・サイドに処理を集約できることがよく分かる。  

 まず,実際に簡単なストアド・プロシジャを作成して,その動きを確認しよう。

リスト2●簡単なストアド・プロシジャの作成と実行


mysql> SELECT * FROM test1 ;
+------+-----------+------+
| no   | name      | memo |
+------+-----------+------+
|    1 | satou     | 佐藤 |
|    2 | suzuki    | 鈴木 |
|    3 | takahashi | 高橋 |
|    4 | tanaka    | 田中 |
|    5 | watanabe  | 渡辺 |
|    6 | yoshida   | 吉田 |
|    8 | saito     | 斉藤 |
|    7 | hayashi   | 林   |
|    9 | yamada    | 山田 |
+------+-----------+------+
9 rows in set (0.01 sec) ――(1)

delimiter | ――(2)

CREATE PROCEDURE simpleproc (OUT param1 INT) ――(3)
BEGIN
    SELECT COUNT(*) INTO param1 FROM test1; ――(4)
END|
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> CALL simpleproc(@a)| ――(5)
Query OK, 0 rows affected (0.02 sec)

mysql> SELECT @a| ――(6)
+------+
| @a   |
+------+
| 9    |
+------+
1 row in set (0.00 sec)

(1) テーブル「test1」を用意した。
(2) 行終了を表す文字を「|」に指定している。プロシジャは複数行で構成されるので,これをやらないと作成できない。
(3) プロシジャ「simpleproc」を作成した。出力用の変数として変数「param1」をINT型で宣言している。
(4) 処理内容は,テーブル「test1」のレコード数を変数「param1」にセットする。
(5) プロシジャ「simpleproc」を実行するには,CALLコマンドを使用する。結果を「@a」に格納する。
(6) 「@a」の内容を表示する。
 以上のような流れで,ストアド・プロシジャの作成から実行の手順がつかめただろうか。

ストアド・プロシジャをプログラミングする

 もう少し複雑なプロシジャの例を紹介しよう。プロシジャ「simpleproc2」は,引数によって,HEAPテーブルの作成とデータの格納を行う例だ。プロシジャの戻り値として,選択した処理内容が文字列で返される。プロシジャ「simpleproc2」では,処理ロジックを構成するIFステートメントとCASEステートメントを使用している。

リスト3●プロシジャ「simpleproc2」のコード


1   CREATE PROCEDURE simpleproc2 (IN ctl INT,OUT msg VARCHAR(50)) 
2   BEGIN 
3     IF ctl = 0 THEN 
4       SET msg = 'NoJob'; 
5     ELSE 
6       DROP TABLE sample; 
7       CREATE TABLE sample (no INT,name VARCHAR(50),
 memo VARCHAR(255)) TYPE=HEAP; 
8 
9       CASE ctl 
10        WHEN 1 THEN 
11  BEGIN 
12    INSERT INTO sample (no,name,memo) VALUES (0,'MySQL','4.0.18');
13    INSERT INTO sample (no,name,memo) VALUES (1,'MaxDB','7.5');
14    SET msg = 'Add Data'; 
15  END; 
16        WHEN 2 THEN 
17  BEGIN 
18    INSERT INTO sample SELECT * FROM test1; 
19    SET msg = 'Copy Table test1'; 
20  END; 
21        ELSE 
22  BEGIN 
23    INSERT INTO sample SELECT * FROM test2; 
24    SET msg = 'Copy Table test2'; 
25  END; 
26      END CASE; 
27    END IF; 
28  END

 実行結果は省略するが,プロシジャ「simpleproc2」によって,データ内容の異なるHEAPテーブルを作成している。MySQL5.1で,トリガーが実装されれば,テーブルの更新に合わせて自動的に実行することも可能だ。

 MySQL 5.0は,SQL:2003に対応し,標準的なSQLステートメントを採用している。そのため,他のデータベースサーバーで修得した,知識がそのまま利用できるはずだ。

佐藤栄一(Satoh Eiichi)

■著者紹介 佐藤栄一(さとうえいいち)
ゼンド・オープンソースシステムズ株式会社 アーキテクト MySQL担当。ゼンド・オープンソースシステムズは,オープンソースによるシステム構築を提案し,情報化投資削減の実現を目指して平成14年12月に設立。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進している。平成15年8月より,MySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。