MySQL में प्रिपेयर्ड स्टेटमेंट का उपयोग करके डायनामिक SQL चलाने और परिणाम को यूजर-डिफाइंड वेरिएबल में असाइन करने के लिए स्टोर्ड प्रोसीजर में PREPARE, EXECUTE, DEALLOCATE PREPARE का उपयोग करें।
सिंटैक्स
SET @sql = CONCAT('SELECT ', column, ' INTO @var FROM ', table, ' WHERE id = ', id);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT @var;
व्यावहारिक उदाहरण
1. टेबल बनाएं और डेटा डालें
mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(100)); Query OK, 0 rows affected (1.51 sec) mysql> INSERT INTO DemoTable VALUES (10, 'John'), (11, 'Chris'); Query OK, 2 rows affected (0.20 sec)
2. स्टोर्ड प्रोसीजर बनाएं
mysql> DELIMITER //
mysql> CREATE PROCEDURE Prepared_Statement_Demo(
IN nameOfTable VARCHAR(20),
IN nameOfColumn VARCHAR(20),
IN idColumnName INT
)
BEGIN
SET @holdResult = CONCAT('SELECT ', nameOfColumn, ' INTO @value FROM ', nameOfTable, ' WHERE id = ', idColumnName);
PREPARE st FROM @holdResult;
EXECUTE st;
DEALLOCATE PREPARE st;
END //
Query OK, 0 rows affected (0.20 sec)
mysql> DELIMITER ;
3. प्रोसीजर कॉल करें
mysql> CALL Prepared_Statement_Demo('DemoTable', 'Name', 10);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
4. परिणाम वेरिएबल से प्राप्त करें
mysql> SELECT @value; +--------+ | @value | +--------+ | John | +--------+ 1 row in set (0.00 sec)
चरण-दर-चरण व्याख्या
CONCAT()- डायनामिक SQL स्ट्रिंग बनाता हैINTO @value- परिणाम को वेरिएबल में स्टोर करता हैPREPARE- SQL स्ट्रिंग से स्टेटमेंट तैयार करता हैEXECUTE- तैयार स्टेटमेंट चलाता हैDEALLOCATE PREPARE- स्टेटमेंट हैंडल मुक्त करता है (महत्वपूर्ण!)
सुरक्षा चेतावनी: SQL इंजेक्शन
-- असुरक्षित: सीधे कन्कैटेनेशन
SET @sql = CONCAT('SELECT * FROM ', table_name, ' WHERE id = ', user_input);
-- सुरक्षित: प्लेसहोल्डर उपयोग करें (MySQL 8.0+ में प्लेसहोल्डर सीमित)
-- एप्लिकेशन लेयर पर पैरामीटराइज़्ड क्वेरी प्राथमिकता दें
उन्नत: परिणाम सेट के लिए कर्सर
CREATE PROCEDURE GetRows(IN tbl VARCHAR(50))
BEGIN
SET @sql = CONCAT('SELECT * FROM ', tbl);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
DEALLOCATE PREPARE का महत्व
- तैयार स्टेटमेंट्स सत्र संसाधन उपयोग करते हैं
- अधिकतम
max_prepared_stmt_count (डिफ़ॉल्ट 16,382) तक सीमित
- लीक होने पर "Too many prepared statements" एरर
- हमेशा
DEALLOCATE PREPARE कॉल करें
max_prepared_stmt_count (डिफ़ॉल्ट 16,382) तक सीमितDEALLOCATE PREPARE कॉल करें