53

INTEGERであるmy_sizeという入力パラメータを持つストアド プロシージャを作成しています。ステートメントの句で使用できるようにしたい。どうやらこれはサポートされていないようですが、これを回避する方法はありますか?LIMITSELECT

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
4

8 に答える 8

16

ストアド プロシージャ

DELIMITER $
create PROCEDURE get_users(page_from INT, page_size INT)
begin
SET @_page_from = page_from;
SET @_page_size = page_size;
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
end$
DELIMITER ;

利用方法

call get_users(1, 10);
于 2012-04-05T08:54:37.027 に答える
15

この回答が遅れていることは知っていますが、SQL_SELECT_LIMIT を試してください。

例:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
于 2011-08-13T16:38:48.807 に答える
15

検索すると、この記事が見つかりました。以下に関連するテキストを貼り付けました。

limit 句に変数値を代入できる準備済みステートメントの例を示すフォーラムの投稿を次に示します。

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

ただし、プロシージャ内の準備済みステートメントがプロシージャのコンパイル時の最適化を可能にすることは想像できないため、このバグには注意を払う必要があると思います。準備されたステートメントはプロシージャの実行時にコンパイルおよび実行されるように感じますが、これはおそらく効率に悪影響を及ぼします。limit 句が通常のプロシージャ変数 (たとえば、プロシージャの引数) を受け入れることができる場合、データベースはプロシージャ内の残りのクエリに対してコンパイル時の最適化を実行できます。これにより、プロシージャの実行が高速化される可能性があります。私は専門家ではありませんが。

于 2008-10-28T23:04:53.803 に答える
11

この機能は MySQL 5.5.6 に追加されました。このリンクをチェックしてください。

この機能のためだけに MySQL 5.5 にアップグレードしましたが、うまく機能しています。5.5 には多くのパフォーマンスのアップグレードも含まれており、私はそれを完全にお勧めします。

于 2012-01-22T15:46:43.493 に答える
3

別の方法として、「Pradeep Sanjaya」と同じですが、CONCAT を使用します。

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;
于 2013-02-13T15:08:50.533 に答える
1

MySQL バージョン 5.5.6 の時点で、変数/パラメーターでLIMITおよびを指定できます。OFFSET

参考までに、5.5 Manual5.6 Manual、および @Quassnoi の回答を参照してください。

于 2015-06-03T06:07:53.490 に答える