MySQL में उपयोगकर्ता-परिभाषित वेरिएबल (@) में SELECT परिणाम स्टोर करना
MySQL में SET @variable = (SELECT ...) या SELECT @variable := ... का उपयोग करके क्वेरी परिणाम को सत्र वेरिएबल में स्टोर कर सकते हैं।
उदाहरण के साथ पूर्ण कार्यान्वयन
टेबल बनाना
mysql> CREATE TABLE DemoTable631 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(100)
);
रिकॉर्ड डालना
mysql> INSERT INTO DemoTable631(StudentName) VALUES('John Smith'), ('Adam Smith'), ('David Miller');
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable631;
आउटपुट:
+-----------+--------------+
| StudentId | StudentName |
+-----------+--------------+
| 1 | John Smith |
| 2 | Adam Smith |
| 3 | David Miller |
+-----------+--------------+
3 rows in set (0.00 sec)
विधि 1: SET के साथ (स्केलर उपक्वेरी)
mysql> SET @fullName = (SELECT StudentName FROM DemoTable631 WHERE StudentId = 2);
परिणाम: Query OK, 0 rows affected (0.00 sec)
विधि 2: SELECT := के साथ
mysql> SELECT @fullName := StudentName FROM DemoTable631 WHERE StudentId = 2;
यह परिणाम सेट भी लौटाता है।
वेरिएबल मान देखना
mysql> SELECT @fullName;
आउटपुट:
+------------+
| @fullName |
+------------+
| Adam Smith |
+------------+
1 row in set (0.00 sec)
मुख्य बिंदु:
@variableसत्र-विशिष्ट उपयोगकर्ता वेरिएबल है (कनेक्शन बंद होने तक जीवित)- उपक्वेरी एकल मान लौटानी चाहिए (एक पंक्ति, एक कॉलम)
- एकाधिक पंक्तियाँ लौटाने पर त्रुटि:
Subquery returns more than 1 row - कोई पंक्ति न मिलने पर वेरिएबल NULL हो जाता है
एकाधिक मान स्टोर करना (JSON के साथ MySQL 5.7+)
SELECT @names := JSON_ARRAYAGG(StudentName) FROM DemoTable631;
SELECT @names; -- ["John Smith", "Adam Smith", "David Miller"]
SELECT JSON_EXTRACT(@names, '$[1]'); -- "Adam Smith"
स्टोर्ड प्रोसीजर में OUT पैरामीटर (बेहतर अभ्यास)
CREATE PROCEDURE GetStudentName(IN id INT, OUT name VARCHAR(100))
BEGIN
SELECT StudentName INTO name FROM DemoTable631 WHERE StudentId = id;
END;
CALL GetStudentName(2, @name);
SELECT @name;
तैयार स्टेटमेंट में उपयोग
SET @id = 2;
PREPARE stmt FROM 'SELECT StudentName FROM DemoTable631 WHERE StudentId = ?';
EXECUTE stmt USING @id;
DEALLOCATE PREPARE stmt;
सत्र वेरिएबल vs स्थानीय वेरिएबल
| प्रकार | वाक्यविन्यास | स्कोप | घोषणा |
|---|---|---|---|
| उपयोगकर्ता वेरिएबल | @name | सत्र | आवश्यक नहीं |
| स्थानीय वेरिएबल | DECLARE name | BEGIN...END ब्लॉक | आवश्यक (DECLARE में) |
| सिस्टम वेरिएबल | @@name | ग्लोबल/सत्र | सर्वर कॉन्फ़िगरेशन |