Search on the blog

2011年10月7日金曜日

プロシージャやサブクエリでLIMIT句を使う場合の注意点

 MySQLでストアードプロシージャ作っていて詰まったのでメモ。limitで指定する値をプロシージャの引数で与えようとしましたが、エラーが出ました。

[ダメな例]
delimiter //
DROP PROCEDURE IF EXISTS `LRU_WORDS`//
CREATE PROCEDURE LRU_WORDS(IN p1 INT)
BEGIN
SELECT * FROM MyDictionary ORDER BY last_delivered LIMIT p1;
END
//
delimiter ;

LIMITは定数じゃないとダメらしいです。

 prepared statementを使う場合は、以下のように変数を利用できます。
一旦ユーザー変数に代入しないとダメなようです。なぜ引数から直で行けないのか・・・

[良い例]
delimiter //
DROP PROCEDURE IF EXISTS `LRU_WORDS`//
CREATE PROCEDURE LRU_WORDS(IN num INT)
BEGIN
SET @limit_num = num;
PREPARE SET_STMT FROM 'SELECT * FROM MyDictionary LIMIT ?';
EXECUTE SET_STMT USING @limit_num;
END
//
delimiter ;

これで解決。

 上のような単純な構文だとOKだけど、LIMITを用いたクエリをサブクエリとして使いたいときにはさらにひと癖あるみたいです。LIMIT句を含むクエリはサブクエリとして利用できないため、以下のように仮想テーブルに一旦落とす必要があります。


0 件のコメント:

コメントを投稿