2009-05-20 43 views
2

我使用的是mysql,我有一個存儲過程,它有一個輸入變量。mysql查詢幫助(如語句)

我想在select語句中使用這個變量(使用like子句)。

如:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `DeleteDataByTransactionID` $$ 
CREATE DEFINER=`root`@`%` PROCEDURE `DeleteDataByTransactionID`(in **$TransactionID** varchar(50)) 

BEGIN 

delete from sqlstatements where tempsql like '%'+ **$TransactionID** + '%'; 

END $$ 


DELIMITER ; 

感謝

回答

8
DELIMITER $$ 
DROP PROCEDURE IF EXISTS `DeleteDataByTransactionID` 
$$ 
CREATE DEFINER=`root`@`%` PROCEDURE `DeleteDataByTransactionID`(TransactionID VARCHAR(50)) 
BEGIN 
     DELETE 
     FROM sqlstatements 
     WHERE tempsql LIKE CONCAT('%', TransactionID, '%'); 
END 
$$ 
DELIMITER ; 
2

事實上,公認的答案的版本是開放的SQL注入,如果調用方不正確的參數調用存儲過程。我建議在存儲過程中使用準備好的聲明如下,以保證安全,而不是依賴呼叫者:

DELIMITER $$ 
CREATE PROCEDURE `DeleteDataByTransactionID` 
(
    TransactionID VARCHAR(50) 
) 
BEGIN 

SET @sql = 
"DELETE 
    FROM sqlstatements 
    WHERE 
    tempsql LIKE CONCAT('%', ?, '%')"; 

SET @transid = TransactionID; 

PREPARE stmt FROM @sql; 
EXECUTE stmt USING @transid; 
DEALLOCATE PREPARE stmt; 

END 
$$