日本国内で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ステートメントを採用している。そのため,他のデータベースサーバーで修得した,知識がそのまま利用できるはずだ。
■著者紹介 佐藤栄一(さとうえいいち)
ゼンド・オープンソースシステムズ株式会社 アーキテクト MySQL担当。ゼンド・オープンソースシステムズは,オープンソースによるシステム構築を提案し,情報化投資削減の実現を目指して平成14年12月に設立。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進している。平成15年8月より,MySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。