2009-05-20 9 views
2

J'utilise mysql dont j'ai une procédure stockée qui a une variable d'entrée.mysql query help (comme instruction)

Je souhaite utiliser cette variable dans une instruction select (avec clause like).

Par exemple:

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 ; 

Merci

Répondre

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

En fait, la version de la réponse acceptée est ouverte à l'injection SQL si l'appelant ne paramétriser pas correctement l'appel à la procédure stockée. Je recommande d'utiliser une instruction préparée dans la procédure stockée comme suit pour être sûr au lieu de compter sur l'appelant:

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 
$$