Utilizzo di SQL come pacchetto ISAM (metodo di accesso sequenziale indicizzato) glorificato. In particolare, annidando i cursori invece di combinare le istruzioni SQL in una singola istruzione, sebbene più ampia. Questo vale anche come "abuso dell'ottimizzatore" poiché in realtà non c'è molto che l'ottimizzatore possa fare. Questo può essere combinato con dichiarazioni non preparate per la massima inefficienza:
DECLARE c1 CURSOR FOR SELECT Col1, Col2, Col3 FROM Table1
FOREACH c1 INTO a.col1, a.col2, a.col3
DECLARE c2 CURSOR FOR
SELECT Item1, Item2, Item3
FROM Table2
WHERE Table2.Item1 = a.col2
FOREACH c2 INTO b.item1, b.item2, b.item3
...process data from records a and b...
END FOREACH
END FOREACH
La soluzione corretta (quasi sempre) è combinare le due istruzioni SELECT in una:
DECLARE c1 CURSOR FOR
SELECT Col1, Col2, Col3, Item1, Item2, Item3
FROM Table1, Table2
WHERE Table2.Item1 = Table1.Col2
-- ORDER BY Table1.Col1, Table2.Item1
FOREACH c1 INTO a.col1, a.col2, a.col3, b.item1, b.item2, b.item3
...process data from records a and b...
END FOREACH
L'unico vantaggio della versione a doppio loop è che puoi facilmente individuare le interruzioni tra i valori in Tabella1 perché il loop interno termina. Questo può essere un fattore nei rapporti di interruzione del controllo.
Inoltre, l'ordinamento nell'applicazione è di solito un no-no.