PL/SQL Cursor Interview Questions & Answers
1. Implicit Cursor to Fetch Total Count of Employees in a Department
-------------------------------------------------------------------
DECLARE
v_department_id NUMBER := 10;
v_total_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_total_count
FROM employees
WHERE department_id = v_department_id;
DBMS_OUTPUT.PUT_LINE('Total Employees: ' || v_total_count);
END;
/
2. Explicit Cursor to Retrieve Employee Details
-----------------------------------------------
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name, salary FROM employees;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.first_name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_emp_name, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_emp_name || ', Salary: ' || v_salary);
END LOOP;
CLOSE emp_cursor;
END;
/
3. Cursor Loop to Fetch and Print All Department Names
------------------------------------------------------
DECLARE
CURSOR dept_cursor IS SELECT department_name FROM departments;
v_dept_name departments.department_name%TYPE;
BEGIN
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO v_dept_name;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department: ' || v_dept_name);
END LOOP;
CLOSE dept_cursor;
END;
/
4. Cursor FOR LOOP to Print Employee IDs and Salaries
-----------------------------------------------------
BEGIN
FOR rec IN (SELECT employee_id, salary FROM employees) LOOP
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || rec.employee_id || ', Salary: ' || rec.salary);
END LOOP;
END;
/
5. Cursor Fetching Records in Reverse Order Using ORDER BY
----------------------------------------------------------
DECLARE
CURSOR rev_cursor IS
SELECT employee_id, first_name FROM employees ORDER BY employee_id DESC;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.first_name%TYPE;
BEGIN
OPEN rev_cursor;
LOOP
FETCH rev_cursor INTO v_emp_id, v_emp_name;
EXIT WHEN rev_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_emp_name);
END LOOP;
CLOSE rev_cursor;
END;
/
6. Using %FOUND and %NOTFOUND Attributes in an Explicit Cursor
--------------------------------------------------------------
DECLARE
CURSOR emp_cursor IS SELECT employee_id, salary FROM employees WHERE salary > 5000;
v_emp_id employees.employee_id%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
IF emp_cursor%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_id || ', Salary: ' || v_salary);
END IF;
END LOOP;
CLOSE emp_cursor;
END;
/
7. Cursor to Update Employee Salaries by 10% and Commit Changes
---------------------------------------------------------------
DECLARE
CURSOR emp_cursor IS SELECT employee_id, salary FROM employees;
v_emp_id employees.employee_id%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
UPDATE employees SET salary = salary * 1.10 WHERE employee_id = v_emp_id;
END LOOP;
CLOSE emp_cursor;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Salaries updated successfully.');
END;
/
8. Explicit Cursor with Parameters for Filtering Employee Data
-------------------------------------------------------------
DECLARE
CURSOR emp_cursor (p_dept_id NUMBER) IS
SELECT employee_id, first_name, salary FROM employees WHERE department_id = p_dept_id;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.first_name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor(10);
LOOP
FETCH emp_cursor INTO v_emp_id, v_emp_name, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_emp_name || ', Salary: ' || v_salary);
END LOOP;
CLOSE emp_cursor;
END;
/
9. Fetch First 5 Records Using a Cursor
---------------------------------------
DECLARE
CURSOR emp_cursor IS SELECT employee_id, first_name FROM employees WHERE ROWNUM <= 5;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.first_name%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_emp_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_emp_name);
END LOOP;
CLOSE emp_cursor;
END;
/
10. Handling an Exception When No Records are Found
---------------------------------------------------
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name FROM employees WHERE department_id = 9999;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.first_name%TYPE;
no_data_found_exception EXCEPTION;
PRAGMA EXCEPTION_INIT(no_data_found_exception, -1403);
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_emp_id, v_emp_name;
IF emp_cursor%NOTFOUND THEN
RAISE no_data_found_exception;
ELSE
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_id || ', Name: ' || v_emp_name);
END IF;
CLOSE emp_cursor;
EXCEPTION
WHEN no_data_found_exception THEN
DBMS_OUTPUT.PUT_LINE('No records found.');
END;
/