Il ciclo FOR

Il ciclo FOR è probabilmente il ciclo più importante implementato in PL/pgSQL. Utilizzare il ciclo theFOR per iterare un blocco di istruzioni su un intervallo di numeri interi specificato. La struttura di un ciclo FOR in PL / pgSQL è simile a FORloops in altri linguaggi procedurali, come C.

In un ciclo PL/pgSQL FOR viene indicata prima una variabile intera, per tracciare l’iterazionedel ciclo, quindi viene fornito l’intervallo intero e infine viene fornito un blocco di istruzioni. La variabile intera creata per tracciare l’iterazione del ciclo viene distrutta una volta che il ciclo esce; non deve essere dichiarata nella sezione di dichiarazione del blocco. Quanto segue mostra la sintassi del ciclo FOR:

 FOR identifier IN expression1 .. expression2 LOOP statement; END LOOP;

Il ciclo FOR eseguirà una singola iterazione per ogni valore incrementato ofidentifier che si trova nell’intervallo di valori tra, e incluso, expression1and expression2. Il valore dell’identificatore verrà inizializzato al valore ofexpression1, indipendentemente dalle impostazioni precedenti, e incrementato di uno per iterazione. IfREVERSE è specificato, identifier sarà decremented ratherthan incrementato.

Nota: l’identificatore utilizzato per tracciare l’iterazione non deve essere dichiarato al di fuori del blocco theFOR, a meno che non si desideri essere in grado di accedere al suo valore dopo che il ciclo è terminato.

Il ciclo FOR può anche essere utilizzato per scorrere i risultati di una query. Thesecond FOR loop nell’esempio 11-45 dimostra l’utilizzo di aFOR loop per lavorare con le variabili RECORD e%ROWTYPE. La sintassi di un ciclo FOR che passa attraverso le variabili RECORD e %ROWTYPE viene mostrata nella seguente sintassi:

 FOR { record_variable | %rowtype_variable } IN select_statement LOOP statement; END LOOP;

Nell’esempio 11-45, la funzione extract_all_titles() viene utilizzata perestrarre un elenco di tutti i titoli di libri esistenti nel database, organizzati per argomento. Quando un soggetto non ha titoli di libri, viene visualizzata la riga ablank. L’elenco viene restituito come variabile di testo. Un ciclo FOR viene utilizzato all’interno della funzione extract_all_titles() per scorrere gli oggetti disponibili per numero.

Un altro ciclo FOR è nidificato all’interno del ciclo originale per scorrere i libri disponibili e recuperare tutti i libri con valori subject_id che corrispondono alla variabile literation del ciclo originale, che rappresenta il numero ID soggetto corrente per cui la funzione sta scansionando. Nell’esempio 11-45, la variabile di iterazione i viene inizializzata a zero perché il primo numero ID soggetto nella nostra tabella soggetti è 0.

Esempio 11-46 mostra il codice di un’altra funzione che utilizza aFOR loop per scorrere i risultati di una query SQL. Con ogni iterazione del loopil ciclo FOR nell’esempio 11-46 posiziona il contenuto di una riga di risultato da una query contro la tabella books nella variabile row_data e quindi inserisce il valore del campo title della riga nella variabile text_output.

Il ciclo termina quando viene raggiunto l’ultimo record nei libri. Alla fine del ciclo,text_output conterrà un elenco di tutti i titoli dei libri che corrispondono al numero ID oggetto passato alla funzione. La variabile text_output viene restituita alla fine della funzione.

Esempio 11-47 mostra i risultati della funzione theextract_title() quando 2, che rappresenta”Libri per bambini” nella tabella oggetto, viene passato come argomento.

La variabile row_data viene dichiarata come %ROWTYPEof della tabella books perché verrà utilizzata solo per contenere record dalla tabella books. Avremmo potuto dichiarare row_data come aRECORD per ottenere lo stesso risultato, ma RECORDtype dovrebbe essere usato quando si utilizzerà la variabile per più di una semplice riga di una tabella specifica:

row_data RECORD;

La funzione extract_title() restituirà gli stessi risultati se i dati di riga sono dichiarati come RECORD o vengono dichiarati utilizzando%ROWTYPE.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.