Utilisation de SQL comme package ISAM (méthode d'accès séquentiel indexé) glorifié. En particulier, imbriquer des curseurs au lieu de combiner des instructions SQL en une seule instruction, quoique plus volumineuse. Cela compte également comme «abus de l'optimiseur» car en fait, l'optimiseur ne peut pas faire grand-chose. Cela peut être combiné avec des déclarations non préparées pour une inefficacité maximale:
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 solution correcte (presque toujours) consiste à combiner les deux instructions SELECT en une seule:
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
Le seul avantage de la version à double boucle est que vous pouvez facilement repérer les ruptures entre les valeurs du tableau 1 car la boucle interne se termine. Cela peut être un facteur dans les rapports de rupture de contrôle.
En outre, le tri dans l'application est généralement un non-non.