Dieser Fall ist genau das, wofür Loops gut sind (und wofür sie entwickelt wurden).
Da Sie Dinge tun, die außerhalb des Gültigkeitsbereichs der Datenbank liegen, ist es vollkommen legitim, dafür Schleifen zu verwenden.
Datenbanken sind so konzipiert, dass sie Daten speichern und die Abfragen für diese Daten durchführen, die sie auf die bequemste Weise zurückgeben.
Relationale Datenbanken können Daten in Form von Rowsets zurückgeben.
Cursor (und Schleifen, die sie verwenden) sind so konzipiert, dass sie ein stabiles Rowset halten, sodass einige Dinge mit jeder seiner Zeilen erledigt werden können.
Mit "Dingen" meine ich hier nicht reine Datenbanktricks, sondern echte Dinge, die die Außenwelt beeinflussen, die Dinge, für die die Datenbank entworfen wurde, sei es das Anzeigen einer Tabelle auf einer Webseite, das Erstellen eines Finanzberichts oder das Versenden einer E-Mail.
Es ist schlecht, Cursor für reine Datenbankaufgaben zu verwenden (wie das Umwandeln eines Rowsets in ein anderes), aber es ist vollkommen nett, sie für die Dinge zu verwenden, die Sie beschrieben haben.
Setbasierte Methoden sind so konzipiert, dass sie innerhalb einer einzigen Transaktion funktionieren.
Wenn Ihre Set-Base-Abfrage aus irgendeinem Grund fehlschlägt, kehrt Ihre Datenbank in den vorherigen Zustand zurück, aber Sie können eine gesendete E-Mail nicht "zurücksetzen". Im Falle eines Fehlers können Sie Ihre Nachrichten nicht verfolgen.