Je ne pense pas que vous ayez besoin de la boucle. Je suppose que vos identifiants sont des clés primaires et que vous ne vouliez pas répéter manivelle plusieurs fois dans votre exemple.
Est-ce que quelque chose comme ça fonctionnerait ?
Modifier selon le commentaire de Raj A. Cela ne mettra à jour que les lignes où l'un des autres champs a changé. Notez que cela ne mettra pas à jour les lignes où l'une est NULL et l'autre n'est pas NULL.
MERGE INTO final T
USING ( SELECT id, score, crank, urank FROM test ) S
ON ( S.vid = T.id AND
( S.crank != T.crank OR S.score != T.score OR S.urank != T.urank ))
WHEN MATCHED SET crank = S.crank, score = S.score,
crank = S.crank, urank = S.urank
WHEN NOT MATCHED THEN INSERT
[... not sure what you want to do in this case ...]