SQL Cursors

Understanding SQL Cursors

SQL Cursors provide a mechanism for row-by-row processing within a database. Unlike traditional SQL queries that operate on entire result sets at once, cursors allow for iterative data retrieval and manipulation. They are particularly useful in scenarios where procedural logic is required to handle complex data operations that cannot be easily achieved with set-based SQL statements.


When to Use Cursors?

Cursors are beneficial when:

    • Sequential access to records is needed for processing.
    • Operations require row-specific calculations.
    • Data manipulation involves multiple-step logic.
    • Transactions demand precise row-by-row updates.

Syntax of SQL Cursor

A cursor follows a structured sequence of steps:

  • Declare - Define the cursor with a SQL query.
  • Open - Initialize and execute the cursor to retrieve the data.
  • Fetch -Retrieve each row one at a time.
  • Process - Perform necessary operations on each retrieved row.
  • Close - Release the cursor.
  • Deallocate - Remove the cursor from memory.

Syntax:

DECLARE cursor_name CURSOR FOR 
SELECT column1, column2 FROM table_name WHERE condition;

OPEN cursor_name;

FETCH NEXT FROM cursor_name INTO @var1, @var2;

WHILE @FETCH_STATUS = 0  
BEGIN  
    -- Process each row  
    -- Example: PRINT or UPDATE  
    FETCH NEXT FROM cursor_name INTO @var1, @var2;  
END  

CLOSE cursor_name;  
DEALLOCATE cursor_name;

Example:

Consider a Customers table that contains customer records. We want to process each record one at a time to display their names.

Customer List

Below is the list of customers with their details.

Customer ID Name City
1 Alice New York
2 Bob Chicago
3 Charlie Los Angeles
DECLARE @CustomerName  VARCHAR(50);

DECLARE customer_cursor CURSOR FOR 
SELECT Name FROM Customers;

OPEN customer_cursor;

FETCH NEXT FROM customer_cursor INTO @CustomerName;

WHILE @FETCH_STATUS = 0  
BEGIN  
    PRINT 'Processing Customer: ' + @CustomerName;
    
    FETCH NEXT FROM customer_cursor INTO @CustomerName;
END  

CLOSE customer_cursor;  
DEALLOCATE customer_cursor;

Explanation:

Processing Customer: Alice
Processing Customer: Bob
Processing Customer: Charlie


Key Points to Remember

Cursors are beneficial when:

    • Cursors should be used sparingly, as they can impact performance.
    • They are useful when set-based operations are not feasible.
    • Always close and deallocate cursors to free up system resources.
    • Consider alternatives like WHILE loops, JOINs, or ROW_NUMBER() for better performance in large datasets.

By understanding and implementing cursors effectively, database developers can manage complex data manipulation processes with greater control.


Previous