La clause Set Row permet de faire des updates d'une table à partir d'un record PL/SQL. La syntaxe utilisée permet d'avoir un code très clair.
Voici un petit exemple illustrant ce principe :
vMyVariable MyTable%RowType;
Update MyTable tab
Set Row = vMyVariable;
Where tab.Id = 5;
Il est également possible de faire un insert utilisant cette variable de la manière suivante :
Insert MyTable
Values vMyVariable;
Cependant, l'update via un set row met à jour toutes les colonnes de la table (même la clé primaire) même si cette valeur reste inchangée. La requete équivalente à l'update ci dessus est la suivante :
Update MyTable tab
Set tab.r1 = 1,
tab.r2 = 2,
tab.r3 = 3,
...
Where tab.Id = 5;
Il n'y a pas besoin de longues explications pour comprendre que dans le cas d'une large table cela peut couter cher de mettre à jour toutes les colonnes si on ne doit juste mettre à jour une ou 2 colonnes.
Pour contrer ce problème, il suffit de définir un subset de la table à mettre à jour. Oracle comprendra alors qu'il ne doit mettre à jour que les colonnes selectionnées par la sous-requete. Il faudra aussi définir un type ne contenant que les colonnes que l'on souhaite mettre à jour. La requete suivante permet de faire ce que l'on souhaite :
update (Select v.r1,tab.r2 from MyTable tab where tab.id = 5)
Set Row = vMyVariable;
Ainsi seules les colonnes que l'on a définie dans la sous requete sont mises à jour !