Cursor în PL/SQL

Instrucţiunile SQL se execută în PL/SQL folosind anumite zone de lucru, numite cursoare. In PL/SQL se folosesc două tipuri de cursoare: Un cursor explicit se defineşte în partea de declaraţii a unei unităţi de program astfel:
CURSOR nume_cursor [(parametru [, parametru] ...)]
IS instructiune_SELECT;

unde un parametru ce apare în lista de parametri se poate folosi numai în această instrucţiune şi are forma:

nume_parametru tip_data [:= expresie]
Exemplu:
DECLARE
  CURSOR sectii IS SELECT cod FROM sectii;  
  CURSOR grupe(an integer) IS SELECT cod,sectia,anstudiu FROM formatii WHERE anuniv=an;
BEGIN
  null;
END;

Parcurgerea înregistrărilor dintr-un cursor se poate face astfel:

  1. Folosirea unei variante a instrucţiunii de ciclare FOR sub forma:
    FOR variabila IN nume_cursor[(lista_parametri)] LOOP
       folosirea unei înregistrări curente din cursor memorată în variabila de ciclare
    END LOOP;
    

    Variabila folosită în instrucţiune trebuie declarată anterior şi trebuie să fie de tipul liniilor din cursor.
    Instructiunea FOR se poate folosi şi sub forma:

    FOR variabila IN (instructiune_select) LOOP
       folosirea unei înregistrări curente din colecţia de înregistrări precizată de instrucţiunea select
    END LOOP;
    

  2. Folosirea unor instrucţiuni şi proprietăti pentru cursor:

Utilizarea unui cursor pentru actualizarea datelor

Exemple de utilizare cursor:
set serveroutput on

declare 
  cursor stud(s char) is
  select distinct st.*
    from studenti st 
    where sectia=s order by nume,prenume;
  x stud%rowtype;
begin
   dbms_output.enable;
   for x in stud('43') loop
      dbms_output.put_line(trim(x.nume) || ' ' || trim(x.prenume));
   end loop;
end;

set serveroutput on

declare 
  cursor stud(s char) is
  select *
    from studenti
    where sectia=s order by nume,prenume;
  x stud%rowtype;
begin
   dbms_output.enable;
   open stud('43');
   fetch stud into x;
   while stud%found loop
      dbms_output.put_line(trim(x.nume) || ' ' || trim(x.prenume));
      fetch stud into x;
   end loop;
  close stud;
end;