In PL/SQL, cursors are used to handle the result set of a query. They allow you to fetch and process rows returned by a SELECT statement. There are two types of cursors in PL/SQL: implicit cursors and explicit cursors.
Implicit Cursors
Implicit cursors are automatically created by Oracle whenever an SQL statement is executed. They are simple to use and are suitable for single-row queries.
Key Points:
- Automatically managed by Oracle.
- Used for single-row queries.
- No need to declare or open the cursor explicitly.
Example:
DECLARE v_employee_name VARCHAR2(50); BEGIN SELECT first_name INTO v_employee_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name); END; /
Explanation:
- The
SELECT INTO
statement automatically creates an implicit cursor. - The result of the query is stored in the variable
v_employee_name
. - The
DBMS_OUTPUT.PUT_LINE
procedure is used to display the result.
Common Mistakes:
- No Data Found Exception: If the query returns no rows, a
NO_DATA_FOUND
exception is raised. - Too Many Rows Exception: If the query returns more than one row, a
TOO_MANY_ROWS
exception is raised.
Explicit Cursors
Explicit cursors are defined and controlled by the programmer. They are used for multi-row queries and provide more control over the context area.
Key Points:
- Must be declared, opened, fetched, and closed explicitly.
- Suitable for multi-row queries.
- Provides more control over the query processing.
Steps to Use Explicit Cursors:
- Declare the Cursor: Define the cursor with a SELECT statement.
- Open the Cursor: Allocate memory for the cursor and execute the query.
- Fetch the Data: Retrieve the rows one by one.
- Close the Cursor: Release the memory associated with the cursor.
Example:
DECLARE CURSOR emp_cursor IS SELECT first_name, last_name FROM employees WHERE department_id = 10; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_first_name, v_last_name; EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE emp_cursor; END; /
Explanation:
- Declare the Cursor: The cursor
emp_cursor
is declared with a SELECT statement. - Open the Cursor: The cursor is opened using the
OPEN
statement. - Fetch the Data: The
FETCH
statement retrieves rows into the variablesv_first_name
andv_last_name
. - Close the Cursor: The cursor is closed using the
CLOSE
statement.
Common Mistakes:
- Not Closing the Cursor: Always close the cursor to free up resources.
- Fetching After Cursor is Closed: Ensure that fetch operations are performed only when the cursor is open.
Practical Exercise
Exercise:
Write a PL/SQL block that uses an explicit cursor to fetch and display the names of all employees in the 'Sales' department.
Solution:
DECLARE CURSOR sales_cursor IS SELECT first_name, last_name FROM employees WHERE department_name = 'Sales'; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN sales_cursor; LOOP FETCH sales_cursor INTO v_first_name, v_last_name; EXIT WHEN sales_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE sales_cursor; END; /
Explanation:
- The cursor
sales_cursor
is declared to select employees from the 'Sales' department. - The cursor is opened, and rows are fetched in a loop.
- The loop exits when there are no more rows to fetch.
- The cursor is closed after processing all rows.
Conclusion
In this section, we covered the basics of implicit and explicit cursors in PL/SQL. Implicit cursors are automatically managed by Oracle and are suitable for single-row queries, while explicit cursors provide more control and are used for multi-row queries. Understanding how to use both types of cursors effectively is crucial for efficient PL/SQL programming. In the next section, we will delve deeper into bulk operations with cursors to handle large datasets efficiently.