Oracle
 sql >> Base de données >  >> RDS >> Oracle

Les validations explicites sont-elles acceptables lorsque la validation automatique est activée ?

S'engager dans une boucle est généralement une mauvaise idée (il en va de même pour permettre à n'importe quel outil de s'engager automatiquement).

La validation à l'intérieur d'une boucle rend beaucoup plus difficile l'écriture de code redémarrable. Que se passe-t-il si vous rencontrez une erreur après 3 itérations ? Vous avez maintenant validé avec succès les résultats de 2 UPDATE déclarations. Vraisemblablement, vous auriez alors besoin soit de déterminer quelles lignes ont été mises à jour et d'écrire du code pour annuler les mises à jour, soit d'ajouter du code qui évite de tenter de mettre à jour les données pour ces deux yearid réussis valeurs. C'est certainement possible. Mais cela implique d'écrire un tas de code pour suivre vos progrès et rend généralement votre code beaucoup plus complexe.

La validation dans une boucle rend votre code beaucoup plus lent. S'engager est généralement une opération assez coûteuse. Le faire en boucle est donc généralement une mauvaise idée. C'est moins un problème si vous n'avez que quelques dizaines d'itérations de boucle. Mais si vous avez des centaines ou des milliers d'itérations, vous pouvez facilement passer la grande majorité de votre temps à vous engager.

La validation à l'intérieur d'une boucle augmente considérablement le risque de provoquer une erreur ORA-01555. Votre requête sur MyTable a besoin d'une vue cohérente en lecture des données. Si vous vous engagez à l'intérieur de la boucle, cependant, vous dites à Oracle que votre session n'a plus besoin de l'ancien UNDO Les données. Si Oracle arrive à purger UNDO données dont vous avez besoin pour une itération ultérieure de la boucle, vous obtiendrez une erreur. Et puis vous êtes de retour avec du code non redémarrable où vous avez réussi N itérations mais vous ne savez pas quelles années ont été traitées ou lesquelles doivent être traitées.

La validation dans une boucle peut créer des problèmes de cohérence des données. Si une autre session exécute des rapports, par exemple, il est facile pour ces rapports de voir des données partiellement mises à jour, ce qui signifie souvent que les données seront incohérentes. Si les données pour 3 ans ont changé mais pas pour les autres années, il peut être très difficile de donner un sens aux rapports et les personnes (ou les processus) peuvent facilement prendre des décisions incorrectes.

La validation dans une boucle rend également votre code moins réutilisable. Si votre code inclut des validations (ou des annulations autres que vers un point de sauvegarde que vous avez établi à l'intérieur du bloc), il ne peut pas être appelé par un autre morceau de code qui ne souhaite pas encore valider sa transaction. Cela conduit les gens à essayer de réimplémenter votre logique sans le contrôle des transactions ou à violer de manière incorrecte l'intégrité transactionnelle, ce qui les conduit inévitablement à créer des applications qui introduisent des problèmes de cohérence des données.