13 septembre 2002

Boucle de mise a jour SQL avec COMMITs intermédiaires


Ci joint un modèle de boucle PL/SQL pour faire des mises à jour SQL avec des COMMITs intermédiaires (ici toutes les 100 mises à jour). Ceci est utile quand les volumes sont trop importants et provoquent des erreurs sur les tablespaces temporaires ou d'undo.

begin
loop
    update/insert/delete ... where ... and rownum < 100;
    exit when sql%rowcount < 99;
    commit;
end loop;
end;
/


Par exemple pour supprimer les travaux Opération de ZO de plus de 90 jours avec COMMIT tous les 10 DELETE :

begin
loop
    delete from ZO00 where TISOUM > '0001-01-01' and TISOUM < SYSDATE - 90 and rownum < 10;
    exit when sql%rowcount < 9;
    commit;
end loop;
end;
/


PS : ce faisant, vous avez libéré de l'espace dans chacune des tables ZO**, mais pas dans les tablespaces HRZO et HRZOI (faire un DELETE ne modifie pas l'espace alloué aux tables, mais libère de l'espace "à l'intérieur" des tables). Si vous souhaitez récupérer l'espace libéré dans chacune des tables pour le rendre disponible à toutes, vous devrez utiliser la commande :
ALTER {TABLE/INDEX} object_name DEALLOCATE UNUSED;