Bird
Raised Fist0
PostgreSQLquery~5 mins

Cursor declaration and usage 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. It allows you to process query results row by row instead of all at once.
Click to reveal answer
beginner
How do you declare a cursor in PostgreSQL?
You declare a cursor using the syntax:
DECLARE cursor_name CURSOR FOR SELECT_statement;
This prepares the cursor to fetch rows from the SELECT query.
Click to reveal answer
beginner
What command is used to fetch rows from a cursor?
The FETCH command is used to retrieve rows from a cursor. For example: FETCH NEXT FROM cursor_name; gets the next row.
Click to reveal answer
intermediate
Why should you close a cursor after use?
Closing a cursor releases the memory and resources it uses. Use CLOSE cursor_name; to close it when done.
Click to reveal answer
intermediate
Explain the typical steps to use a cursor in PostgreSQL.
1. Declare the cursor with a SELECT query.
2. Open the cursor (optional in PostgreSQL, DECLARE opens it).
3. Fetch rows one by one or in blocks.
4. Close the cursor to free resources.
Click to reveal answer
Which SQL command declares a cursor in PostgreSQL?
ADECLARE cursor_name CURSOR FOR SELECT * FROM table;
BOPEN cursor_name;
CFETCH cursor_name;
DCLOSE cursor_name;
What does the FETCH command do?
ARetrieves rows from the cursor
BCloses the cursor
CDeclares a new cursor
DOpens the cursor
Why is it important to CLOSE a cursor?
ATo start fetching rows
BTo declare the cursor
CTo release resources used by the cursor
DTo open the cursor
Which of these is NOT a typical step when using a cursor?
ADeclare the cursor
BInsert rows into the cursor
CFetch rows
DClose the cursor
In PostgreSQL, when is a cursor opened?
AWhen you fetch from it
BWhen you commit a transaction
CWhen you close it
DWhen you declare it
Describe how to declare, fetch from, and close a cursor in PostgreSQL.
Think about the three main commands: DECLARE, FETCH, CLOSE.
You got /3 concepts.
    Explain why cursors are useful when working with large query results.
    Consider memory and performance when handling big data.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of declaring a cursor in PostgreSQL?
      easy
      A. To speed up bulk inserts
      B. To process query results one row at a time
      C. To create a new table in the database
      D. To backup the database automatically

      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 with cursor purpose

        Only To process query results one row at a time describes this behavior; others describe unrelated tasks.
      3. Final Answer:

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

        Cursor purpose = process rows one by one [OK]
      Hint: Cursors handle rows stepwise, not bulk operations [OK]
      Common Mistakes:
      • Confusing cursors with table creation
      • Thinking cursors speed up inserts
      • Assuming cursors automate backups
      2. Which of the following is the correct syntax to declare a cursor named cur_emp for selecting all rows from employees table?
      easy
      A. CREATE CURSOR cur_emp AS SELECT * FROM employees;
      B. OPEN cur_emp CURSOR SELECT * FROM employees;
      C. DECLARE cur_emp CURSOR FOR SELECT * FROM employees;
      D. FETCH cur_emp FROM employees;

      Solution

      1. Step 1: Recall cursor declaration syntax

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

        DECLARE cur_emp CURSOR FOR SELECT * FROM employees; matches this exactly; others use incorrect keywords or order.
      3. Final Answer:

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

        DECLARE + CURSOR + FOR + query = correct syntax [OK]
      Hint: Use DECLARE ... CURSOR FOR ... to declare [OK]
      Common Mistakes:
      • Using OPEN instead of DECLARE for declaration
      • Confusing FETCH with DECLARE
      • Using CREATE CURSOR which is invalid syntax
      3. Given the following code snippet, what will be the output after fetching from the cursor?
      DECLARE cur_emp CURSOR FOR SELECT id FROM employees ORDER BY id LIMIT 3;
      OPEN cur_emp;
      FETCH NEXT FROM cur_emp;
      FETCH NEXT FROM cur_emp;
      medium
      A. First two employee ids in ascending order
      B. All employee ids from the table
      C. Syntax error due to missing CLOSE statement
      D. Empty result because cursor is not opened

      Solution

      1. Step 1: Understand cursor declaration and fetch

        The cursor selects 3 employee ids ordered ascending. FETCH NEXT retrieves one row each time.
      2. Step 2: Analyze fetch calls

        Two FETCH NEXT calls return the first two rows from the cursor result.
      3. Final Answer:

        First two employee ids in ascending order -> Option A
      4. Quick Check:

        Two FETCH NEXT = two rows fetched [OK]
      Hint: Each FETCH returns one row in cursor order [OK]
      Common Mistakes:
      • Assuming FETCH returns all rows at once
      • Thinking missing CLOSE causes syntax error
      • Believing cursor must be closed before fetching
      4. Identify the error in the following cursor usage:
      DECLARE cur_dept CURSOR FOR SELECT name FROM departments;
      FETCH NEXT FROM cur_dept;
      OPEN cur_dept;
      CLOSE cur_dept;
      medium
      A. Cursor declaration syntax is incorrect
      B. Cursor is declared after fetching
      C. Cursor is closed before declaration
      D. Cursor is fetched before it is opened

      Solution

      1. Step 1: Check the order of cursor operations

        Cursors must be declared, then opened, then fetched, then closed.
      2. Step 2: Identify incorrect sequence

        Here, FETCH is called before OPEN, which is invalid.
      3. Final Answer:

        Cursor is fetched before it is opened -> Option D
      4. Quick Check:

        OPEN must precede FETCH [OK]
      Hint: Always OPEN cursor before FETCH [OK]
      Common Mistakes:
      • Fetching before opening cursor
      • Closing cursor before opening
      • Misordering declaration and fetch
      5. You want to process all rows from orders table one by one using a cursor in a PL/pgSQL function. Which sequence of statements correctly implements this?
      hard
      A. DECLARE cur_orders CURSOR FOR SELECT * FROM orders; OPEN cur_orders; LOOP FETCH cur_orders INTO rec; EXIT WHEN NOT FOUND; -- process rec END LOOP; CLOSE cur_orders;
      B. OPEN cur_orders; DECLARE cur_orders CURSOR FOR SELECT * FROM orders; FETCH cur_orders INTO rec; CLOSE cur_orders;
      C. DECLARE cur_orders CURSOR FOR SELECT * FROM orders; FETCH cur_orders INTO rec; OPEN cur_orders; CLOSE cur_orders;
      D. DECLARE cur_orders CURSOR FOR SELECT * FROM orders; OPEN cur_orders; FETCH ALL FROM cur_orders INTO rec; CLOSE cur_orders;

      Solution

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

        Declare cursor, open it, then loop fetching rows until no more rows, then close cursor.
      2. Step 2: Analyze each option

        DECLARE cur_orders CURSOR FOR SELECT * FROM orders; OPEN cur_orders; LOOP FETCH cur_orders INTO rec; EXIT WHEN NOT FOUND; -- process rec END LOOP; CLOSE cur_orders; follows correct order and uses LOOP with EXIT WHEN NOT FOUND to process all rows. Others have wrong order or invalid FETCH ALL.
      3. Final Answer:

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

        Declare, Open, Loop Fetch, Close = correct pattern [OK]
      Hint: Use LOOP with FETCH and EXIT WHEN NOT FOUND [OK]
      Common Mistakes:
      • Opening cursor before declaring
      • Fetching before opening
      • Using FETCH ALL which is invalid for cursors