Basic Cursor Examples
1. Simple Explicit Cursor
CREATE OR REPLACE PROCEDURE simple_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
emp_rec emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
CLOSE emp_cursor;
END;
2. Cursor with Parameters
CREATE OR REPLACE PROCEDURE employees_by_dept(p_dept_id IN NUMBER) IS
CURSOR dept_cursor IS
SELECT employee_id, employee_name FROM employees WHERE department_id = p_dept_id;
emp_rec dept_cursor%ROWTYPE;
BEGIN
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO emp_rec;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
CLOSE dept_cursor;
END;
3. Cursor with FOR Loop
CREATE OR REPLACE PROCEDURE cursor_for_loop IS
BEGIN
FOR emp_rec IN (SELECT employee_id, employee_name FROM employees) LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
END;
4. Cursor with Record Type
CREATE OR REPLACE PROCEDURE cursor_record_type IS
TYPE emp_record IS RECORD (
employee_id employees.employee_id%TYPE,
employee_name employees.employee_name%TYPE
);
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
emp_rec emp_record;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
CLOSE emp_cursor;
END;
5. Cursor for Bulk Collect
CREATE OR REPLACE PROCEDURE bulk_collect_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
BEGIN
SELECT * BULK COLLECT INTO v_employees FROM employees;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
Advanced Cursor Examples
6. Cursor with Ref Cursor
CREATE OR REPLACE PROCEDURE get_employee_data(p_cursor OUT SYS_REFCURSOR) IS
BEGIN
OPEN p_cursor FOR
SELECT employee_id, employee_name FROM employees;
END;
7. Using Cursor Variables
CREATE OR REPLACE PROCEDURE process_employee_cursor(p_cursor IN SYS_REFCURSOR) IS
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
LOOP
FETCH p_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN p_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employee_id || ' Name: ' || v_employee_name);
END LOOP;
CLOSE p_cursor;
END;
8. Cursor with Dynamic SQL
CREATE OR REPLACE PROCEDURE dynamic_cursor_example(p_table_name IN VARCHAR2) IS
v_query VARCHAR2(1000);
CURSOR dyn_cursor IS
SELECT * FROM employees; -- Example query
BEGIN
v_query := 'SELECT * FROM ' || p_table_name;
OPEN dyn_cursor FOR v_query;
-- Process cursor as needed
CLOSE dyn_cursor;
END;
9. Cursor with a Nested Cursor
CREATE OR REPLACE PROCEDURE nested_cursor_example IS
CURSOR dept_cursor IS
SELECT department_id, department_name FROM departments;
CURSOR emp_cursor(p_dept_id NUMBER) IS
SELECT employee_id, employee_name FROM employees WHERE department_id = p_dept_id;
v_dept_id departments.department_id%TYPE;
v_dept_name departments.department_name%TYPE;
BEGIN
FOR dept_rec IN dept_cursor LOOP
v_dept_id := dept_rec.department_id;
v_dept_name := dept_rec.department_name;
DBMS_OUTPUT.PUT_LINE('Department: ' || v_dept_name);
FOR emp_rec IN emp_cursor(v_dept_id) LOOP
DBMS_OUTPUT.PUT_LINE(' Employee ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
END LOOP;
END;
10. Cursor with Aggregated Data
CREATE OR REPLACE PROCEDURE aggregated_data_cursor IS
CURSOR avg_salary_cursor IS
SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id;
BEGIN
FOR rec IN avg_salary_cursor LOOP
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || rec.department_id || ' Avg Salary: ' || rec.avg_salary);
END LOOP;
END;
More Complex Cursor Scenarios
11. Cursor with Exception Handling
CREATE OR REPLACE PROCEDURE cursor_with_exception IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
emp_rec emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
CLOSE emp_cursor;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred: ' || SQLERRM);
END;
12. Cursor with an Update
CREATE OR REPLACE PROCEDURE update_employee_salary IS
CURSOR emp_cursor IS
SELECT employee_id, salary FROM employees;
BEGIN
FOR emp_rec IN emp_cursor LOOP
UPDATE employees
SET salary = salary * 1.05
WHERE employee_id = emp_rec.employee_id;
END LOOP;
END;
13. Cursor with INSERT Operation
CREATE OR REPLACE PROCEDURE insert_from_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees WHERE salary < 30000;
BEGIN
FOR emp_rec IN emp_cursor LOOP
INSERT INTO low_salary_employees (employee_id, employee_name)
VALUES (emp_rec.employee_id, emp_rec.employee_name);
END LOOP;
END;
14. Cursor to Fetch Data into a Collection
CREATE OR REPLACE PROCEDURE fetch_into_collection IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
15. Cursor to Manage Pagination
CREATE OR REPLACE PROCEDURE paginate_cursor(p_page_number IN NUMBER, p_page_size IN NUMBER) IS
CURSOR paginated_cursor IS
SELECT * FROM (
SELECT a.*, ROWNUM rnum FROM (
SELECT employee_id, employee_name FROM employees ORDER BY employee_id
) a WHERE ROWNUM <= p_page_number * p_page_size
) WHERE rnum > (p_page_number - 1) * p_page_size;
BEGIN
FOR emp_rec IN paginated_cursor LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || emp_rec.employee_id || ' Name: ' || emp_rec.employee_name);
END LOOP;
END;
Using Cursors with PL/SQL Tables and Nested Tables
16. Cursor with PL/SQL Table
CREATE OR REPLACE PROCEDURE cursor_with_table IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
17. Cursor with Nested Table Type
CREATE OR REPLACE PROCEDURE nested_table_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v
_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
18. Cursor with REF Cursor in PL/SQL Table
CREATE OR REPLACE PROCEDURE ref_cursor_with_table(p_cursor OUT SYS_REFCURSOR) IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
BEGIN
OPEN p_cursor FOR SELECT * FROM employees;
FETCH p_cursor BULK COLLECT INTO v_employees;
CLOSE p_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
19. Cursor with Nested Cursor and PL/SQL Table
CREATE OR REPLACE PROCEDURE nested_cursor_with_table IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR dept_cursor IS
SELECT department_id FROM departments;
CURSOR emp_cursor(p_dept_id NUMBER) IS
SELECT * FROM employees WHERE department_id = p_dept_id;
BEGIN
FOR dept_rec IN dept_cursor LOOP
OPEN emp_cursor(dept_rec.department_id);
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || dept_rec.department_id || ' Employee ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END LOOP;
END;
20. Cursor with Nested Tables and REF Cursors
CREATE OR REPLACE PROCEDURE nested_table_ref_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR dept_cursor IS
SELECT department_id FROM departments;
CURSOR emp_cursor(p_dept_id NUMBER) IS
SELECT * FROM employees WHERE department_id = p_dept_id;
BEGIN
FOR dept_rec IN dept_cursor LOOP
OPEN emp_cursor(dept_rec.department_id);
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || dept_rec.department_id || ' Employee ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END LOOP;
END;
Cursor Management Examples
21. Cursor with Dynamic SQL and Bind Variables
CREATE OR REPLACE PROCEDURE dynamic_cursor_with_bind(p_dept_id IN NUMBER) IS
v_query VARCHAR2(500);
CURSOR dyn_cursor IS
SELECT employee_id, employee_name FROM employees WHERE department_id = p_dept_id;
BEGIN
v_query := 'SELECT employee_id, employee_name FROM employees WHERE department_id = :1';
OPEN dyn_cursor FOR v_query USING p_dept_id;
-- Process cursor as needed
CLOSE dyn_cursor;
END;
22. Cursor to Handle Multiple Cursors
CREATE OR REPLACE PROCEDURE multi_cursor_handling IS
CURSOR dept_cursor IS
SELECT department_id FROM departments;
CURSOR emp_cursor(p_dept_id NUMBER) IS
SELECT employee_id, employee_name FROM employees WHERE department_id = p_dept_id;
BEGIN
FOR dept_rec IN dept_cursor LOOP
OPEN emp_cursor(dept_rec.department_id);
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || dept_rec.department_id || ' Employee ID: ' || v_employee_id || ' Name: ' || v_employee_name);
END LOOP;
CLOSE emp_cursor;
END LOOP;
END;
23. Cursor with Prior Data Validation
CREATE OR REPLACE PROCEDURE validate_data_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees WHERE salary > 0;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
IF v_employee_id IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Invalid ID for Employee: ' || v_employee_name);
END IF;
END LOOP;
CLOSE emp_cursor;
END;
24. Cursor to Use REF Cursor for Client Application
CREATE OR REPLACE PROCEDURE client_app_ref_cursor(p_cursor OUT SYS_REFCURSOR) IS
BEGIN
OPEN p_cursor FOR
SELECT employee_id, employee_name FROM employees;
END;
25. Cursor with SQL%ROWCOUNT
CREATE OR REPLACE PROCEDURE cursor_with_rowcount IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
v_rowcount NUMBER;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor;
v_rowcount := emp_cursor%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('Number of rows fetched: ' || v_rowcount);
CLOSE emp_cursor;
END;
More Advanced Cursor Techniques
26. Cursor with REF Cursor and PL/SQL Table
CREATE OR REPLACE PROCEDURE ref_cursor_with_table(p_cursor OUT SYS_REFCURSOR) IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
BEGIN
OPEN p_cursor FOR SELECT * FROM employees;
FETCH p_cursor BULK COLLECT INTO v_employees;
CLOSE p_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
27. Cursor to Fetch Data in Batches
CREATE OR REPLACE PROCEDURE batch_fetch_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor BULK COLLECT INTO v_employees LIMIT 100;
EXIT WHEN v_employees.COUNT = 0;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END LOOP;
CLOSE emp_cursor;
END;
28. Cursor to Handle Data Inconsistencies
CREATE OR REPLACE PROCEDURE handle_data_inconsistencies IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name, salary FROM employees;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
IF v_salary < 0 THEN
DBMS_OUTPUT.PUT_LINE('Inconsistent data: ID: ' || v_employee_id || ' Name: ' || v_employee_name || ' Salary: ' || v_salary);
END IF;
END LOOP;
CLOSE emp_cursor;
END;
29. Cursor with Recursive Query
CREATE OR REPLACE PROCEDURE recursive_cursor IS
CURSOR dept_cursor IS
WITH RECURSIVE org_chart AS (
SELECT department_id, department_name, manager_id FROM departments WHERE manager_id IS NULL
UNION ALL
SELECT d.department_id, d.department_name, d.manager_id
FROM departments d
INNER JOIN org_chart o ON d.manager_id = o.department_id
)
SELECT department_id, department_name FROM org_chart;
BEGIN
FOR dept_rec IN dept_cursor LOOP
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || dept_rec.department_id || ' Name: ' || dept_rec.department_name);
END LOOP;
END;
30. Cursor to Fetch and Update Data
CREATE OR REPLACE PROCEDURE fetch_and_update_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, salary FROM employees WHERE salary < 50000;
v_employee_id employees.employee_id%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
UPDATE employees
SET salary = salary + 1000
WHERE employee_id =
v_employee_id;
END LOOP;
CLOSE emp_cursor;
END;
Cursor with PL/SQL Collections
31. Cursor with Nested Table Collection
CREATE OR REPLACE PROCEDURE nested_table_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
32. Cursor with Associative Array
CREATE OR REPLACE PROCEDURE associative_array_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
v_index PLS_INTEGER := 1;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor BULK COLLECT INTO v_employees LIMIT 100;
EXIT WHEN v_employees.COUNT = 0;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
v_index := v_index + 1;
END LOOP;
CLOSE emp_cursor;
END;
33. Cursor with Cursor Variables and Collections
CREATE OR REPLACE PROCEDURE cursor_variable_with_collection IS
TYPE emp_table IS TABLE OF employees%ROWTYPE;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
34. Cursor with Global Temporary Tables
CREATE OR REPLACE PROCEDURE cursor_with_temp_table IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
BEGIN
CREATE GLOBAL TEMPORARY TABLE temp_employees (
employee_id NUMBER,
employee_name VARCHAR2(100)
) ON COMMIT DELETE ROWS;
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
INSERT INTO temp_employees (employee_id, employee_name) VALUES (v_employee_id, v_employee_name);
END LOOP;
CLOSE emp_cursor;
-- Process data in temp_employees table
END;
35. Cursor with Complex Aggregation
CREATE OR REPLACE PROCEDURE complex_aggregation_cursor IS
CURSOR avg_salary_cursor IS
SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id;
BEGIN
FOR rec IN avg_salary_cursor LOOP
DBMS_OUTPUT.PUT_LINE('Dept ID: ' || rec.department_id || ' Avg Salary: ' || rec.avg_salary);
END LOOP;
END;
36. Cursor with XML Data Handling
CREATE OR REPLACE PROCEDURE xml_cursor_example IS
CURSOR xml_cursor IS
SELECT XMLTYPE('<root><employee><id>1</id><name>John</name></employee></root>') AS xml_data FROM dual;
v_xml XMLTYPE;
BEGIN
OPEN xml_cursor;
FETCH xml_cursor INTO v_xml;
CLOSE xml_cursor;
DBMS_OUTPUT.PUT_LINE('XML Data: ' || v_xml.getCLOBVal());
END;
37. Cursor with JSON Data Handling
CREATE OR REPLACE PROCEDURE json_cursor_example IS
CURSOR json_cursor IS
SELECT JSON_OBJECT('id' VALUE employee_id, 'name' VALUE employee_name) AS json_data
FROM employees;
v_json VARCHAR2(4000);
BEGIN
OPEN json_cursor;
LOOP
FETCH json_cursor INTO v_json;
EXIT WHEN json_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('JSON Data: ' || v_json);
END LOOP;
CLOSE json_cursor;
END;
38. Cursor with Transaction Control
CREATE OR REPLACE PROCEDURE cursor_with_transaction IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
-- Perform transaction-related operations
-- e.g., INSERT, UPDATE, DELETE operations
END LOOP;
CLOSE emp_cursor;
COMMIT;
END;
39. Cursor with DBMS_SQL Package
CREATE OR REPLACE PROCEDURE dynamic_cursor_dbms_sql IS
v_cursor INTEGER;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor, 'SELECT employee_id, employee_name FROM employees', DBMS_SQL.STATIC);
DBMS_SQL.DEFINE_COLUMN(v_cursor, 1, v_employee_id);
DBMS_SQL.DEFINE_COLUMN(v_cursor, 2, v_employee_name);
DBMS_SQL.EXECUTE(v_cursor);
LOOP
IF DBMS_SQL.FETCH_ROWS(v_cursor) > 0 THEN
DBMS_SQL.COLUMN_VALUE(v_cursor, 1, v_employee_id);
DBMS_SQL.COLUMN_VALUE(v_cursor, 2, v_employee_name);
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employee_id || ' Name: ' || v_employee_name);
ELSE
EXIT;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END;
40. Cursor with Recursive Hierarchical Query
CREATE OR REPLACE PROCEDURE hierarchical_cursor IS
CURSOR hierarchy_cursor IS
WITH RECURSIVE org_chart AS (
SELECT employee_id, manager_id, employee_name FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.manager_id, e.employee_name
FROM employees e
INNER JOIN org_chart o ON e.manager_id = o.employee_id
)
SELECT * FROM org_chart;
BEGIN
FOR rec IN hierarchy_cursor LOOP
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || rec.employee_id || ' Name: ' || rec.employee_name || ' Manager ID: ' || rec.manager_id);
END LOOP;
END;
41. Cursor with PL/SQL Table Operations
CREATE OR REPLACE PROCEDURE plsql_table_cursor IS
TYPE emp_table IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
v_employees emp_table;
CURSOR emp_cursor IS
SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO v_employees;
CLOSE emp_cursor;
FOR i IN v_employees.FIRST..v_employees.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || v_employees(i).employee_id || ' Name: ' || v_employees(i).employee_name);
END LOOP;
END;
42. Cursor with Output Parameters
CREATE OR REPLACE PROCEDURE cursor_with_output(p_output OUT SYS_REFCURSOR) IS
BEGIN
OPEN p_output FOR
SELECT employee_id, employee_name FROM employees;
END;
43. Cursor with SQL%FOUND and SQL%NOTFOUND
CREATE OR REPLACE PROCEDURE cursor_with_found_notfound IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_employee_id, v_employee_name;
IF emp_cursor%FOUND THEN
DBMS_OUTPUT.PUT_LINE('First Row - ID: ' || v_employee_id || ' Name: ' || v_employee_name);
END IF;
FETCH emp_cursor INTO v_employee_id, v_employee_name;
IF emp_cursor%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No more rows.');
END IF;
CLOSE emp_cursor;
END;
44. Cursor with Multiple Fetches
CREATE OR REPLACE PROCEDURE multiple_fetches_cursor IS
CURSOR emp_cursor IS
SELECT employee_id, employee_name FROM employees;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_employee_id, v_employee_name;
DBMS_OUTPUT.PUT_LINE('First Fetch - ID: ' || v_employee_id || ' Name: ' || v_employee_name);
FETCH emp_cursor INTO v_employee_id, v_employee_name;
DBMS_OUTPUT.PUT_LINE('Second Fetch - ID: ' || v_employee_id || ' Name: ' || v
_employee_name);
CLOSE emp_cursor;
END;
No comments:
Post a Comment