CURSOR in Procedures
In this page:
DECLARE cursor_name CURSOR FOR select_statement;
OPEN cursor_name;
FETCH cursor_name INTO variable;
CLOSE cursor_name;
एक Cursor क्या है?
एक cursor किसी stored procedure को एक query result की rows में एक बार में एक step through करने देता है, जो तब ज़रूरी है जब आपको per-row logic चलानी हो जो एक single set-based SQL statement आसानी से express नहीं कर सकता।
उदाहरण: What is a Cursor?
DELIMITER //
CREATE PROCEDURE ListUserNames()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE uname TEXT;
DECLARE cur CURSOR FOR SELECT name FROM users;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO uname;
IF done THEN
LEAVE read_loop;
END IF;
SELECT uname;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
एक Cursor से Opening और Fetching
एक cursor इस्तेमाल करना OPEN से शुरू होता है, और हर बाद का FETCH current row के column values को local variables में copy करता है ताकि procedure अगले पर जाने से पहले उस एक row को inspect या इस पर act कर सके।
उदाहरण: Opening and Fetching from a Cursor
DELIMITER //
CREATE PROCEDURE FirstUserName()
BEGIN
DECLARE uname TEXT;
DECLARE cur CURSOR FOR SELECT name FROM users;
OPEN cur;
FETCH cur INTO uname;
CLOSE cur;
SELECT uname;
END //
DELIMITER ;
एक Cursor में Loop चलाना
FETCH को एक loop के अंदर wrap करना एक procedure को पूरे result set में row by row चलने देता है, आमतौर पर एक handler के साथ pair किया गया जो detect करता है कि कब कोई और rows नहीं बचीं और loop से exit करता है।
उदाहरण: Looping Through a Cursor
DELIMITER //
CREATE PROCEDURE SumAllPrices()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE p INT;
DECLARE total INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT price FROM products;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO p;
IF done THEN
LEAVE read_loop;
END IF;
SET total = total + p;
END LOOP;
CLOSE cur;
SELECT total;
END //
DELIMITER ;
Cursor बंद करना
काम खत्म होने पर CLOSE से एक cursor बंद करना MySQL द्वारा उस result set के लिए hold की गई memory release करता है — एक long-running procedure पर यह step skip करना server resources बर्बाद कर सकता है।
उदाहरण: Closing the Cursor
DELIMITER //
CREATE PROCEDURE FirstUserName()
BEGIN
DECLARE uname TEXT;
DECLARE cur CURSOR FOR SELECT name FROM users;
OPEN cur;
FETCH cur INTO uname;
CLOSE cur; -- releases the result set MySQL was holding
SELECT uname;
END //
DELIMITER ;
एक Procedure में कई Cursors
एक single procedure एक साथ कई cursors declare और इस्तेमाल कर सकती है, लेकिन उन्हें सही order में declare किया जाना ज़रूरी है — किसी भी local variables के बाद, लेकिन किसी भी handlers से पहले — नहीं तो MySQL एक syntax error raise करेगा।
उदाहरण: Multiple Cursors in a Procedure
DELIMITER //
CREATE PROCEDURE TwoCursors()
BEGIN
DECLARE uname TEXT;
DECLARE pname TEXT;
DECLARE cur1 CURSOR FOR SELECT name FROM users;
DECLARE cur2 CURSOR FOR SELECT name FROM products;
OPEN cur1;
OPEN cur2;
FETCH cur1 INTO uname;
FETCH cur2 INTO pname;
CLOSE cur1;
CLOSE cur2;
SELECT uname, pname;
END //
DELIMITER ;
- items को गलत order में declare करना, जबकि variables पहले आने चाहिए, फिर cursors, फिर handlers।
NOT FOUNDhandler भूल जाना, ताकि rows खत्म होने परFETCHएक error के साथ fail हो जाए।- loop के बाद cursor को
CLOSEकरना भूल जाना।
- Stored procedures SQL के saved blocks हैं जो parameters ले सकते हैं।
- User-defined functions एक value return करते हैं जिसे आप queries में इस्तेमाल कर सकते हैं।
- Procedures ज़्यादा complex logic के लिए
IF, loops, और cursors इस्तेमाल कर सकती हैं।
Chapter Quiz — Complete all 5 topics to unlock
0/5 topics done
Complete these topics first: