Eu não acho que você precisa do loop. Estou assumindo que seus ids são chaves primárias e você não quis repetir a manivela várias vezes em seu exemplo.
Algo assim funcionaria?
Edite por comentário de Raj A. Isso atualizará apenas as linhas em que um dos outros campos foi alterado. Observe que isso não atualizará as linhas em que uma é NULL e a outra não é 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 ...]