2013-10-03 18 views
7

Sto cercando di creare una procedura semplice con i parametri.MySQL (stored procedure) - parametri e query

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

Il primo ingresso è la colonna il secondo è la direzione di ordinamento

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 

Nell'esempio precedente ho solo output 2 parametri così posso vedere cosa succede.

Risultato:

"c" 
`mode` ASC 

.

Quando si esegue la procedura con il codice previsto, di seguito.

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 

Risultati

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 

Come si può vedere i risultati non sono ordinati per mode.

Qualsiasi aiuto è apprezzato.

risposta

10

Purtroppo, è necessario PREPARE intera query in questo caso:

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 ; 

NOTA: approccio descritto deve essere usato molto attenti, perché è vulnurable ad attacchi di SQL Injection, se usato in modo non corretto.

Problemi correlati