7

パラメータを使用して簡単なプロシージャを作成しようとしています。

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

最初の入力は列、2 番目の入力はソート方向です

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

どんな助けでも大歓迎です。

4

1 に答える 1

11

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 インジェクション攻撃に対して脆弱になるため、慎重に使用する必要があります。

于 2013-10-03T18:01:41.797 に答える