Kasus ini adalah persisnya loop yang baik untuk (dan dirancang untuk).
Karena Anda melakukan hal-hal yang berada di luar cakupan basis data, penggunaan perulangan untuk hal tersebut sangatlah sah.
Basis data dirancang untuk menyimpan data dan melakukan kueri terhadap data ini yang mengembalikannya dengan cara yang paling praktis.
Basis data relasional dapat mengembalikan data dalam bentuk kumpulan baris.
Kursor (dan loop yang menggunakannya) dirancang untuk menjaga rowset yang stabil sehingga beberapa hal dengan setiap barisnya dapat dilakukan.
Yang saya maksud dengan "sesuatu" di sini bukanlah trik basis data murni, tetapi hal-hal nyata yang memengaruhi dunia luar, hal-hal yang dirancang untuk basis data, baik itu menampilkan tabel di halaman web, membuat laporan keuangan, atau mengirim email.
Tidak baik menggunakan kursor untuk tugas database murni (seperti mengubah satu baris ke baris lainnya), tetapi sangat baik menggunakannya untuk hal-hal seperti yang Anda jelaskan.
Metode berbasis kumpulan dirancang untuk bekerja dalam satu transaksi.
Jika kueri set-base Anda akan gagal karena suatu alasan, database Anda akan kembali ke keadaan sebelumnya, tetapi Anda tidak dapat "mengembalikan" email yang dikirim. Anda tidak akan dapat melacak pesan Anda jika terjadi kesalahan.