2013-10-03 1 views
7

매개 변수를 사용하여 간단한 프로 시저를 만들려고합니다.MySQL (저장) 프로 시저 - 매개 변수 및 쿼리

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 

.

나는 아래의 의도 된 코드와 함께 프로 시저를 실행할 때. 당신이 결과를 mode으로 분류되지 않습니다 볼 수 있듯이

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 

결과.

도움을 주시면 감사하겠습니다.

답변

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 때문에 잘못 사용하면 설명 된 접근 방식은, 매우 조심 을 사용해야합니다.