2013-10-03 16 views
7

パラメータを使用して簡単なプロシージャを作成しようとしています。MySQL(Stored)プロシージャ - パラメータとクエリ

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

第一の入力は、第二のソート方向上の例では

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 

ある私は何が起こっているか見ることができるようにそれだけで2つのパラメータを出力有するカラムです。

結果:

"c" 
`mode` ASC 

このプロシージャを実行すると、そのコードは次のようになります。

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 

結果

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 

あなたは結果がmodeによってソートされていない見ることができるように。

何か助けていただければ幸いです。

答えて

10

残念ながら、あなたがこのケースでPREPARE全体のクエリする必要があります。

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 ; 

注:間違って使用する場合には、SQLインジェクション攻撃にvulnurableあるので説明したアプローチは、非常に慎重使用する必要があります。

関連する問題