Bird
Raised Fist0
PostgreSQLquery~5 mins

Performing operations on cursors in PostgreSQL - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is a cursor in PostgreSQL?
A cursor is a database object used to retrieve a few rows from a query result at a time, allowing row-by-row processing instead of loading all rows at once.
Click to reveal answer
beginner
How do you declare a cursor in PostgreSQL?
You declare a cursor using the DECLARE statement inside a PL/pgSQL block, for example:
DECLARE my_cursor CURSOR FOR SELECT * FROM employees;
Click to reveal answer
beginner
What does the FETCH command do with a cursor?
FETCH retrieves the next set of rows from the cursor's result set. For example, FETCH NEXT FROM my_cursor; gets the next row.
Click to reveal answer
intermediate
Why should you CLOSE a cursor after use?
Closing a cursor releases the resources associated with it. If you don't close it, resources remain allocated, which can cause performance issues.
Click to reveal answer
intermediate
How do you move a cursor to a specific position?
You use the MOVE command to reposition the cursor without fetching data. For example, MOVE ABSOLUTE 5 IN my_cursor; moves the cursor to the 5th row.
Click to reveal answer
Which command is used to start reading rows from a declared cursor in PostgreSQL?
AFETCH
BDECLARE
COPEN
DMOVE
What happens if you try to FETCH from a cursor that is not OPEN?
AIt closes the cursor
BIt returns an empty result
CAn error occurs
DIt automatically opens the cursor
Which statement correctly closes a cursor named 'cur1'?
AFINISH cur1;
BEND cur1;
CSTOP cur1;
DCLOSE cur1;
What does the MOVE command do in cursor operations?
ARepositions the cursor without returning rows
BFetches the next row
CCloses the cursor
DDeclares a new cursor
Which of the following is NOT a valid cursor operation in PostgreSQL?
ADECLARE
BINSERT
CFETCH
DCLOSE
Explain the lifecycle of a cursor in PostgreSQL and the main operations you perform on it.
Think about how you start, use, reposition, and finish with a cursor.
You got /6 concepts.
    Describe why and when you would use a cursor instead of a simple SELECT query.
    Consider situations where you don't want to load all data at once.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of using a cursor in PostgreSQL?
      easy
      A. To process query results one row at a time
      B. To speed up query execution by parallel processing
      C. To permanently store query results in a table
      D. To automatically optimize query plans

      Solution

      1. Step 1: Understand what a cursor does

        A cursor allows you to handle query results row by row instead of all at once.
      2. Step 2: Compare options

        Only To process query results one row at a time correctly describes this row-wise processing purpose.
      3. Final Answer:

        To process query results one row at a time -> Option A
      4. Quick Check:

        Cursor = row-by-row processing [OK]
      Hint: Cursors process rows one by one, not all at once [OK]
      Common Mistakes:
      • Thinking cursors speed up queries automatically
      • Confusing cursors with temporary tables
      • Assuming cursors optimize query plans
      2. Which of the following is the correct syntax to declare a cursor named cur1 for a SELECT query in PostgreSQL?
      easy
      A. OPEN cur1 CURSOR FOR SELECT * FROM employees;
      B. DECLARE cur1 CURSOR FOR SELECT * FROM employees;
      C. FETCH cur1 CURSOR FOR SELECT * FROM employees;
      D. CREATE CURSOR cur1 FOR SELECT * FROM employees;

      Solution

      1. Step 1: Recall cursor declaration syntax

        In PostgreSQL, cursors are declared using DECLARE cursor_name CURSOR FOR query.
      2. Step 2: Match syntax with options

        DECLARE cur1 CURSOR FOR SELECT * FROM employees; matches the correct DECLARE syntax; others misuse OPEN, FETCH, or CREATE.
      3. Final Answer:

        DECLARE cur1 CURSOR FOR SELECT * FROM employees; -> Option B
      4. Quick Check:

        DECLARE cursor FOR query [OK]
      Hint: Use DECLARE to define cursor before OPEN or FETCH [OK]
      Common Mistakes:
      • Using OPEN instead of DECLARE to define cursor
      • Trying to FETCH during declaration
      • Using CREATE CURSOR which is invalid
      3. Consider this PostgreSQL code snippet:
      DECLARE cur CURSOR FOR SELECT id FROM users ORDER BY id;
      OPEN cur;
      FETCH NEXT FROM cur;
      FETCH NEXT FROM cur;
      CLOSE cur;

      What will be the output of the two FETCH commands if the users table has ids 10, 20, 30 in ascending order?
      medium
      A. First FETCH returns 10, second FETCH returns 20
      B. First FETCH returns 20, second FETCH returns 30
      C. Both FETCH commands return 10
      D. First FETCH returns 30, second FETCH returns NULL

      Solution

      1. Step 1: Understand cursor order and FETCH

        The cursor selects ids ordered by id: 10, 20, 30. FETCH NEXT returns rows sequentially.
      2. Step 2: Trace FETCH commands

        First FETCH returns the first row: 10. Second FETCH returns the next row: 20.
      3. Final Answer:

        First FETCH returns 10, second FETCH returns 20 -> Option A
      4. Quick Check:

        FETCH NEXT returns rows in order [OK]
      Hint: FETCH NEXT returns rows in declared order one by one [OK]
      Common Mistakes:
      • Assuming FETCH skips rows
      • Confusing FETCH NEXT with FETCH ALL
      • Expecting FETCH to return NULL before end
      4. Given this code snippet:
      DECLARE cur CURSOR FOR SELECT name FROM products;
      OPEN cur;
      FETCH cur;
      CLOSE cur;
      FETCH cur;

      What error will occur when running this code?
      medium
      A. ERROR: cursor "cur" does not exist
      B. No error, FETCH returns next row
      C. ERROR: syntax error near FETCH
      D. ERROR: cursor "cur" is not open

      Solution

      1. Step 1: Analyze cursor lifecycle

        Cursor is declared and opened, then FETCH is called once, then cursor is closed.
      2. Step 2: Identify error on second FETCH

        After CLOSE, cursor is not open, so FETCH causes "cursor is not open" error.
      3. Final Answer:

        ERROR: cursor "cur" is not open -> Option D
      4. Quick Check:

        FETCH after CLOSE causes 'not open' error [OK]
      Hint: Cannot FETCH after CLOSE; cursor must be open [OK]
      Common Mistakes:
      • Trying to FETCH after cursor is closed
      • Expecting FETCH to reopen cursor automatically
      • Confusing 'not open' with 'does not exist' error
      5. You want to process a large table orders row by row using a cursor in a PL/pgSQL function. Which sequence of commands correctly opens the cursor, fetches all rows one by one, and closes it after processing?
      hard
      A. DECLARE cur CURSOR FOR SELECT * FROM orders; OPEN cur; FETCH ALL FROM cur; CLOSE cur;
      B. OPEN cur; DECLARE cur CURSOR FOR SELECT * FROM orders; FETCH cur INTO rec; CLOSE cur;
      C. DECLARE cur CURSOR FOR SELECT * FROM orders; OPEN cur; LOOP FETCH cur INTO rec; EXIT WHEN NOT FOUND; -- process rec END LOOP; CLOSE cur;
      D. DECLARE cur CURSOR FOR SELECT * FROM orders; FETCH cur INTO rec; OPEN cur; CLOSE cur;

      Solution

      1. Step 1: Understand correct cursor usage in PL/pgSQL

        Declare cursor, open it, then loop fetching rows until no more rows (EXIT WHEN NOT FOUND), then close cursor.
      2. Step 2: Evaluate options

        DECLARE cur CURSOR FOR SELECT * FROM orders; OPEN cur; LOOP FETCH cur INTO rec; EXIT WHEN NOT FOUND; -- process rec END LOOP; CLOSE cur; correctly shows DECLARE, OPEN, LOOP with FETCH and EXIT, then CLOSE. Others misuse order or FETCH ALL which fetches all rows at once.
      3. Final Answer:

        DECLARE cur CURSOR FOR SELECT * FROM orders; OPEN cur; LOOP FETCH cur INTO rec; EXIT WHEN NOT FOUND; -- process rec END LOOP; CLOSE cur; -> Option C
      4. Quick Check:

        Cursor loop with FETCH and EXIT WHEN NOT FOUND [OK]
      Hint: Use LOOP with FETCH and EXIT WHEN NOT FOUND to process cursor rows [OK]
      Common Mistakes:
      • Opening cursor after FETCH
      • Using FETCH ALL instead of looping FETCH
      • Closing cursor before processing all rows