2013-10-03 11 views
7

Ich versuche, eine einfache Prozedur mit Parametern zu erstellen.MySQL (Gespeichert) Prozedur - Parameter und Abfrage

CALL new_procedure('mode', 'ASC'); 

Der erste Eingang ist die Spalte der zweite die Richtung sort

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 

    DECLARE order_by varchar(30); 
    SET @order_by = CONCAT('`', in_order_by_column, '` ', in_order_by_direction); 
/* 
    SELECT * FROM `common_tags` ORDER BY @order_by LIMIT 5; 
*/ 
    SELECT @order_by as 'c'; 

END 

Im obigen Beispiel ist habe ich es die 2 Parameter nur ausgibt, so kann ich sehen, was passiert.

Ergebnis:

"c" 
`mode` ASC 

.

Wenn ich die Prozedur mit dem vorgesehenen Code unten ausführen.

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 

    DECLARE order_by varchar(30); 
    SET @order_by = CONCAT('`', in_order_by_column, '` ', in_order_by_direction); 
    SELECT * FROM `common_tags` ORDER BY @order_by LIMIT 5; 

END 

Ergebnisse

tags_id  data    mode  parent_id  position 
1   Wood    2   13    6 
2   Trippy    0   0    0 
4   Artists    1   0    1 
6   "Newest Additions" 1   0    11 
12   "Natural Elements" 2   5    8 

Wie Sie die Ergebnisse sehen können mode nicht sortiert werden.

Jede Hilfe wird geschätzt.

Antwort

10

Leider müssen Sie PREPARE gesamte Abfrage in diesem Fall:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `new_procedure`$$ 

CREATE PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 
    SET @buffer = CONCAT_WS('', 
     'SELECT * FROM `common_tags` ORDER BY `', in_order_by_column, '` ', in_order_by_direction, ' LIMIT 5' 
    ); 

    PREPARE stmt FROM @buffer; 
    EXECUTE stmt; 

    DEALLOCATE PREPARE stmt; 
END$$ 

DELIMITER ; 

HINWEIS: Beschrieben Ansatz sollte sehr vorsichtig verwendet werden, da es vulnurable zu SQL-Injection-Attacken ist, wenn falsch verwendet.

Verwandte Themen