Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A cursor variable which is based on REF CURSOR data type can be associated with different queries at run-time. The primary advantage of using cursor variables is their capability to pass result sets between sub programs (like stored procedures, functions, packages etc.). Examples: REF CURSOR WITH %TYPE:
1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12
DECLARE TYPE r_cursor IS REF CURSOR; c_employee r_cursor; en employee.ename%TYPE; BEGIN OPEN c_employee FOR select ename from employee; LOOP FETCH c_employee INTO en; EXIT WHEN c_employee%NOTFOUND; dbms_output.put_line(en); END LOOP; CLOSE c_employee; END;
DECLARE TYPE r_cursor IS REF CURSOR; c_employee r_cursor; er employee%ROWTYPE; BEGIN OPEN c_employee FOR select * from employee; LOOP FETCH c_employee INTO er; exit when c_employee%NOTFOUND; dbms_output.put_line(er.ename || ' - ' || er.position); END LOOP; CLOSE c_employee; END;
DECLARE TYPE r_cursor IS REF CURSOR; c_employee r_cursor; TYPE rec_emp IS RECORD ( name VARCHAR2(40), position VARCHAR2(40) ); er rec_emp; BEGIN OPEN c_employee FOR select ename,position from employee; LOOP FETCH c_employee INTO er; exit when c_employee%NOTFOUND;
13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
DECLARE TYPE r_cursor IS REF CURSOR; c_employee r_cursor; TYPE rec_emp IS RECORD ( name VARCHAR2(40), position VARCHAR2(40) ); er rec_emp; BEGIN OPEN c_employee FOR select ename,position from employee where deptname = IT; dbms_output.put_line('Department: IT'); dbms_output.put_line('--------------'); LOOP FETCH c_employee INTO er; exit when c_employee%NOTFOUND; dbms_output.put_line(er.name || ' - ' || er.position); END LOOP; CLOSE c_employee; OPEN c_employee FOR select ename,position from employee where deptname = Finance; dbms_output.put_line('Department: Finance'); dbms_output.put_line('--------------'); loop fetch c_employee into er; exit when c_employee%NOTFOUND; dbms_output.put_line(er.name || ' - ' || er.position); END LOOP; CLOSE c_employee; END;
It is static in definition.
A ref cursor cannot. (you cannot define them OUTSIDE of a procedure / function)
The performance of normal cursors is much more efficient than ref cursors and hence you should use ref cursor only when you absolutely have to.