MySQL स्टोर्ड प्रोसीजर में डायनामिक WHERE IN() क्लॉज का उपयोग करने के लिए प्रिपेयर्ड स्टेटमेंट (Prepared Statements) का उपयोग करना पड़ता है, क्योंकि IN क्लॉज में सीधे पैरामीटर पास नहीं किया जा सकता।
समस्या
सीधे पैरामीटर उपयोग नहीं कर सकते:
-- यह काम नहीं करेगा:
SELECT * FROM table WHERE id IN (input_param);
समाधान: डायनामिक SQL
DELIMITER //
CREATE PROCEDURE whereInDemo(IN input VARCHAR(100))
BEGIN
SET @Query = 'SELECT Name FROM DemoTable ';
SET @Query = CONCAT(@Query, ' WHERE Id IN (', input, ')');
PREPARE stmt FROM @Query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
उदाहरण
तालिका और डेटा:
mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(20));
mysql> INSERT INTO DemoTable VALUES (100, 'Chris'), (101, 'Bob'), (102, 'David');
प्रोसीजर कॉल करें
mysql> CALL whereInDemo('100,102');
परिणाम
+-------+
| Name |
+-------+
| Chris |
| David |
+-------+
महत्वपूर्ण बिंदु
CONCAT()- क्वेरी स्ट्रिंग बनाता हैPREPARE- SQL स्टेटमेंट तैयार करता हैEXECUTE- तैयार स्टेटमेंट निष्पादित करता हैDEALLOCATE PREPARE- स्टेटमेंट मुक्त करता है- इनपुट स्ट्रिंग में मान कॉमा से अलग होने चाहिए:
'1,2,3'
सुरक्षा चेतावनी
यह दृष्टिकोण SQL इंजेक्शन के लिए संवेदनशील है। उत्पादन में मान्य करें या पैरामीटराइज़्ड क्वेरी के विकल्प तलाशें।