Frage

Ich bin eine gespeicherte Prozedur zu schreiben, wo ich einen Eingabeparameter mit dem Namen my_size , die ein INTEGER ist . Ich möchte in der Lage, es in einer LIMIT-Klausel in einer SELECT Anweisung zu verwenden. Offenbar dies nicht unterstützt wird, gibt es eine Möglichkeit, dies zu umgehen?

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

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
War es hilfreich?

Lösung

Eine Suche aufgedreht diesem Artikel href="http://bugs.mysql.com/bug.php?id=8094". Ich habe den entsprechenden Text eingefügt.

  

Hier ist ein Forum Post ein Beispiel für vorbereitete Anweisungen zeigen lassen   Sie weisen Sie einen variablen Wert auf die limit-Klausel:

     

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

     

Aber ich denke, sollte dieser Fehler etwas Aufmerksamkeit bekommen, weil ich kann nicht   vorstellen, dass vorbereitete Anweisungen in einer Prozedur für jeden ermöglichen   Verfahren-Kompilierung-Optimierungen. Ich habe das Gefühl, die vorbereitet   Aussagen zusammengestellt und zur Laufzeit des Verfahrens ausgeführt,   was sich probaby eine negative Auswirkung auf die Effizienz. Wenn die Grenze   Klausel könnte normale Prozedur Variablen annehmen (beispielsweise ein Verfahren,   Argument), dann könnte die Datenbank noch Compile-Zeit durchführen   Optimierungen auf dem Rest der Abfrage innerhalb der Prozedur. Diese   ergeben würde wahrscheinlich eine schnellere Ausführung des Verfahrens. Ich bin kein Experte   though.

Andere Tipps

Für diejenigen, die nicht MySQL verwenden können 5.5.6+ und wollen nicht eine gespeicherte Prozedur schreiben, gibt es eine weitere Variante. Wir können where-Klausel auf einem subselect mit ROWNUM hinzuzufügen.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;

Stored Procedure

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 ;

VERWENDUNG

call get_users(1, 10);

Ich weiß, diese Antwort zu spät gekommen, aber versuchen SQL_SELECT_LIMIT.

Beispiel:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

Diese Funktion wurde in MySQL 5.5.6 hinzugefügt. Aktivieren Sie diese Option Link aus.

Ich habe 5.5 nur für diese Funktion zu MySQL aktualisiert und funktioniert super. 5.5 auch viele Performance-Upgrades an Ort und Stelle hat und ich es sehr empfehlen.

Eine andere Möglichkeit, die gleiche wie schrieb "Pradeep Sanjaya", aber unter Verwendung von 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;

Ab MySQL-Version 5.5.6 können Sie angeben, LIMIT und OFFSET mit Variablen / Parameter.

Als Referenz finden Sie in der 5.5 Handbuch rel="nofollow , 5.6 Handbuch und @ Quassnoi der beantworten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top