Det här fodralet är precis vad loopar är bra för (och designade för).
Eftersom du gör saker som faller utanför databasens räckvidd är det helt legitimt att använda loopar för dem.
Databaser är utformade för att lagra data och utföra frågor mot dessa data som returnerar dem på ett praktiskt sätt.
Relationsdatabaser kan returnera data i form av raduppsättningar.
Markörer (och loopar som använder dem) är utformade för att hålla en stabil raduppsättning så att vissa saker med var och en av dess rader kan göras.
Med "saker" menar jag här inte rena databastrick, utan verkliga saker som påverkar omvärlden, de saker som databasen är designad för, vare sig det är att visa en tabell på en webbsida, generera en ekonomisk rapport eller skicka ett e-postmeddelande.
Det är dåligt att använda markörer för rena databasuppgifter (som att omvandla en raduppsättning till en annan), men det är mycket trevligt att använda dem för saker som den du beskrev.
Uppsättningsbaserade metoder är utformade för att fungera inom en enda transaktion.
Om din set-base-fråga kommer att misslyckas av någon anledning, kommer din databas att återgå till det tillstånd som var tidigare, men du kan inte "återställa" ett skickat e-postmeddelande. Du kommer inte att kunna hålla reda på dina meddelanden i händelse av ett fel.