back to top

Strutture iterative in PL/SQL – Guida Oracle

Per strutture iterative (anche dette controlli iterativi o, più comunemente, cicli) si intendono quei costrutti che consentono di eseguire ciclicamente una serie di istruzioni fino a quando non si verifica una condizione oppure terminano gli elementi da "ciclare". Fondamentalmente, il PL/SQL offre tre diversi tipi di costrutti per il controllo di flusso iterativo:

  • Ciclo semplice
  • Ciclo WHILE
  • Ciclo FOR
Essi si differenziano tra loro per piccoli aspetti, che vedremo a seguire, e proprio per questo, a seconda dei casi, troveremo più utile utilizzarne uno piuttosto che un altro.

Ciclo semplice

La sintassi del ciclo semplice è la seguente:

LOOP
  Istruzioni;
END LOOP;
Scritto così, avremmo praticamente un ciclo infinito. Per fare in modo che esso termini, abbiamo bisogno di una condizione di uscita. Quindi, generalmente il ciclo semplice viene utilizzato nella seguente forma:
LOOP
  Istruzioni;
  EXIT WHEN condizione;
END LOOP;
Un suo utilizzo potrebbe essere il seguente:
DECLARE
  Contatore NUMBER(2):= 1;

BEGIN
  LOOP 
    contatore := contatore +1;
    INSERT INTO Log (Messaggio) VALUES ('Contatore CICLO SEMPLICE: ' || contatore);
    EXIT WHEN contatore >= 10;
  END LOOP;
END;
Avremo che la nostra variabile contatore verrà incrementata di 1 fino a quando non raggiungerà un valore maggiore o uguale a 10, a quel punto il nostro ciclo verrà terminato.

Ciclo WHILE

Il ciclo WHILE, ripete la nostra sequenza di istruzioni mentre la condizione è verificata (TRUE), termina quando essa non lo è più (FALSE oppure NULL). La condizione viene valutata prima di entrare nel ciclo, ciò implica che se essa risulta FALSE oppure NULL nessuna sequenza di istruzioni viene eseguita. Come per il ciclo semplice, esso può comunque essere terminato tramite una istruzione EXIT. La sintassi del ciclo WHILE è la seguente:

WHILE condizione
LOOP
  Istruzione1;
  Istruzione2;
  ...;
END LOOP;
Un suo utilizzo potrebbe essere il seguente:
DECLARE
  Contatore NUMBER(2):= 1;
BEGIN
  WHILE contatore <= 10
  LOOP
    contatore := contatore +1;
    INSERT INTO Log (Messaggio) VALUES ('Contatore CICLO WHILE: ' || contatore);
  END LOOP;
END;
La nostra variabile ha, inizialmente, valore 1, quindi il ciclo ha inizio. La variabile viene incrementata fino a quando raggiunge il valore 10, a quel punto, dato che la condizione è ancora verificata, viene incrementata ancora una volta. A questo punto la condizione diventa FALSE ed il ciclo termina.

Ciclo FOR

Il ciclo FOR, a differenza del ciclo WHILE, consente di indicare un range di valori all'interno del quale verificare la condizione. Non occorre dichiarare la variabile perché essa viene definita implicitamente all'interno del ciclo. Inoltre, come vedremo, permette di agire sulla nostra variabile non solo in maniera incrementale ma anche decrementale. La sintassi del ciclo FOR è la seguente:

FOR contatore IN [REVERSE] min..max
LOOP
  Istruzione1;
  istruzione2;
  ...;
END LOOP;
Il contatore viene incrementato implicitamente di 1 ad ogni ciclo, il ciclo termina quando esso raggiunge il valore max. Da notare che se il min risulta superiore al max il ciclo non viene mai eseguito. Inoltre, se si utilizza la calusola REVERSE al posto di IN, il ciclo viene eseguito assegnando alla variabile il valore max che viene, di volta in volta, decrementato di 1 fino a che raggiunge il valore min. Un suo utilizzo potrebbe essere il seguente:
DECLARE
BEGIN
  FOR contatore IN 1..10
  LOOP
    INSERT INTO Log (Messaggio) VALUES ('Contatore CICLO FOR: ' || contatore);
  END LOOP;
END;
La nostra variabile, che come abbiamo avuto modo di vedere non è stato necessario dichiarare, parte con valore 1, viene man mano incrementata fino a che non raggiunge il valore 10 allorché il ciclo si interrompe.

Pubblicitร