डायनामिक SQL: यूजर-डिफाइंड वेरिएबल + PREPARE/EXECUTE
रनटाइम पर कॉलम नामों की सूची बनाकर एक क्वेरी बनाने के लिए, INFORMATION_SCHEMA.COLUMNS, GROUP_CONCAT, CONCAT, और तैयार स्टेटमेंट (PREPARE, EXECUTE, DEALLOCATE PREPARE) का उपयोग करें।
चरण-दर-चरण प्रक्रिया
- कॉलम नामों की सूची बनाएं एक यूजर-डिफाइंड वेरिएबल में।
- तैयार करें
PREPAREके साथ। - निष्पादित करें
EXECUTEके साथ। - मुक्त करें
DEALLOCATE PREPAREके साथ।
सिंटैक्स
-- 1. क्वेरी स्ट्रिंग बनाएं
SET @q := (
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT('1 AS ', COLUMN_NAME) SEPARATOR ', '),
' FROM DUAL'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
);
-- 2. तैयार करें
PREPARE stmt FROM @q;
-- 3. निष्पादित करें
EXECUTE stmt;
-- 4. मुक्त करें
DEALLOCATE PREPARE stmt;
व्यावहारिक उदाहरण
टेबल बनाना
mysql> CREATE TABLE ConcatenationWithUserDefinedVariable (
Id INT NOT NULL AUTO_INCREMENT,
User_Id INT,
PRIMARY KEY(Id)
);
क्वेरी स्ट्रिंग बनाना
mysql> SET @q := (
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT('1 AS ', COLUMN_NAME) SEPARATOR ', '),
' FROM DUAL'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ConcatenationWithUserDefinedVariable'
);
तैयार करना और निष्पादित करना
mysql> PREPARE stmt FROM @q; mysql> EXECUTE stmt;
+----+---------+ | Id | User_Id | +----+---------+ | 1 | 1 | +----+---------+
मुक्त करना
mysql> DEALLOCATE PREPARE stmt;
व्याख्या
INFORMATION_SCHEMA.COLUMNS— मेटाडेटा से कॉलम नाम प्राप्त करता है।CONCAT('1 AS ', COLUMN_NAME)— प्रत्येक कॉलम के लिए1 AS ColNameबनाता है।GROUP_CONCAT(... SEPARATOR ', ')— सभी को कॉमा से जोड़ता है।PREPARE/EXECUTE— डायनामिक SQL निष्पादन।
उपयोग के मामले
- डायनामिक पिवट/क्रॉसटैब क्वेरी बनाना।
- रनटाइम पर निर्धारित कॉलम के साथ SELECT बनाना।
- मेटाडेटा-चालित कोड जनरेशन।
सुरक्षा चेतावनी
डायनामिक SQL इंजेक्शन के प्रति संवेदनशील है। कभी भी अविश्वसनीय इनपुट को सीधे क्वेरी स्ट्रिंग में न जोड़ें। मानों के लिए प्लेसहोल्डर (?) के साथ PREPARE उपयोग करें।