--Esempio di Cursore Esplicito con Ciclo LOOP

DECLARE
  -- CREAZIONE CURSORE
  CURSOR C_CLIENTI
  IS
    SELECT
      A.NOME
      || ' '
      || A.COGNOME AS Nominativo,
      B.NUMSPESE,
      B.VALTOT
    FROM
      CLIENTI A
    JOIN
      (
        SELECT
          CODFID,
          COUNT( * )  AS NUMSPESE,
          SUM(TOTALE) AS VALTOT
        FROM
          SCONTRINI
        GROUP BY
          CODFID
      )
    B
  ON
    A.CODFIDELITY = B.CODFID
  WHERE
    B.NUMSPESE  > 20
  AND B.VALTOT  > 200
  AND B.CODFID <> - 1
  ORDER BY
    B.VALTOT DESC;

  V_CLIENTI C_CLIENTI%ROWTYPE;
BEGIN
  DBMS_OUTPUT.PUT_LINE ('Apertura Cursore');
  OPEN C_CLIENTI; -- Apertura Cursore

  DBMS_OUTPUT.PUT_LINE ('Fetch Cursore');

  LOOP --Inizio del Ciclo LOOP
    FETCH
      C_CLIENTI
    INTO
      V_CLIENTI; --FETCH DEL CURSORE
    EXIT
  WHEN C_CLIENTI%NOTFOUND;

    --DBMS_OUTPUT.PUT_LINE ('RECORD TROVATO');

    IF V_CLIENTI.VALTOT > 400 THEN
      DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo ||' ha fatto spese per  ' ||
      V_CLIENTI.VALTOT || ' ed ha diritto a 10 coupon');
    ELSIF V_CLIENTI.VALTOT > 300 AND V_CLIENTI.VALTOT < 400 THEN
      DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo ||' ha fatto spese per  ' ||
      V_CLIENTI.VALTOT || ' ed ha diritto a 5 coupon');
    ELSE
      DBMS_OUTPUT.PUT_LINE(C_CLIENTI%ROWCOUNT || ') Il Cliente '||V_CLIENTI.Nominativo ||
      ' NON ha diritto ad alcun premio! ');
    END IF;

  END LOOP;

  DBMS_OUTPUT.PUT_LINE ('CHIUSURA DEL CURSORE');
  CLOSE C_CLIENTI;

EXCEPTION
  WHEN OTHERS THEN
    IF C_CLIENTI%ISOPEN THEN
      CLOSE C_CLIENTI;
    END IF;
END;
