← Back to MySQL Course | Chapter 15: Stored Procedures & Functions | Lesson 5 of 5

CURSOR in Procedures

एक cursor एक list के नीचे move करती एक finger जैसा है, procedure को पूरी table के बजाय एक बार में एक row पढ़ने देता है।
Syntax
sql
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?

sql
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 ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

एक Cursor से Opening और Fetching

एक cursor इस्तेमाल करना OPEN से शुरू होता है, और हर बाद का FETCH current row के column values को local variables में copy करता है ताकि procedure अगले पर जाने से पहले उस एक row को inspect या इस पर act कर सके।

उदाहरण: Opening and Fetching from a Cursor

sql
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 ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

एक Cursor में Loop चलाना

FETCH को एक loop के अंदर wrap करना एक procedure को पूरे result set में row by row चलने देता है, आमतौर पर एक handler के साथ pair किया गया जो detect करता है कि कब कोई और rows नहीं बचीं और loop से exit करता है।

उदाहरण: Looping Through a Cursor

sql
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 ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

Cursor बंद करना

काम खत्म होने पर CLOSE से एक cursor बंद करना MySQL द्वारा उस result set के लिए hold की गई memory release करता है — एक long-running procedure पर यह step skip करना server resources बर्बाद कर सकता है।

उदाहरण: Closing the Cursor

sql
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 ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

एक Procedure में कई Cursors

एक single procedure एक साथ कई cursors declare और इस्तेमाल कर सकती है, लेकिन उन्हें सही order में declare किया जाना ज़रूरी है — किसी भी local variables के बाद, लेकिन किसी भी handlers से पहले — नहीं तो MySQL एक syntax error raise करेगा।

उदाहरण: Multiple Cursors in a Procedure

sql
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 ;

⚠️ This is MySQL-specific syntax. It cannot run in the browser editor. Practice this on your local MySQL installation.

Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. items को गलत order में declare करना, जबकि variables पहले आने चाहिए, फिर cursors, फिर handlers।
  2. NOT FOUND handler भूल जाना, ताकि rows खत्म होने पर FETCH एक error के साथ fail हो जाए।
  3. 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:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.