Procédure stockée la gestion des exceptions
SQL> DECLARE
2 TotalUpd NUMBER(36) := 0;
3 BEGIN
4 dbms_output.put_line ('Job Start time............... : ' || to_char(SYSDATE, ' hh24:mi:ss'));
5 UPDATE Asset SET _status = 'PROGRESS' WHERE status is null;
6 TotalUpd := SQL%ROWCOUNT;
7 dbms_output.put_line('Total Records Updated. : ' || TotalUpd);
8 COMMIT;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 dbms_output.put_line ('No more data to update.');
12 WHEN OTHERS THEN
13 dbms_output.put_line ('Error while status as SUCCESS ');
14 END ;
15 /
Le résultat de la procédure ci-dessus est
Heure de Début de travail............... : 04:41:41
Nombre Total D'Enregistrements Mis À Jour. : 0
Mais mon résultat attendu est "Pas plus de ligne à mettre à jour" doit être imprimée,depuis que j'ai tronqué le tableau de l'Actif.Merci de dire où je suis allé de mal en cela.
Vous devez vous connecter pour publier un commentaire.
c'est aussi simple que la mise à jour n'geneate un message d'erreur si il n'y a pas de données.
vous avez besoin de regarder la valeur de
TotalUpd
si vous voulez contrôler le flux de votre codeLa
NO_DATA_FOUND
erreur n'est pas jeté dans la mise à jour des déclarations.Il est jeté dans
select into
états si l'instruction select serait de retour rien.Voir aussi Tahiti sur sélectionner dans sous select_item: *Si l'instruction SELECT INTO ne retourne aucune ligne, PL/SQL soulève l'exception prédéfinie NO_DATA_FOUND.*
Oracle ne la considère pas comme une exception si une instruction de mise à jour ne permet pas de mettre à jour quoi que ce soit, donc aucune exception n'est levée. Toutefois, si une instruction select into ne peut pas remplir les variables, il est considéré comme une erreur (et donc dans ce cas, le NO_DATA_EXCEPTION est levée(
NO_DATA_FOUND
est levée si uneselect into
ne retourne pas une ligne, pas si pas de lignes ont été mis à jour après une instruction de mise à jour.Je vous suggère de passer votre logique pour le traitement de cette exception, après la mise à jour elle-même:
Pense NO_DATA_FOUND exception n'est soulevée par une instruction SELECT qui vous ne l'utilisez pas. Essayez de tester SQL%COMTE et de la production en tant que de besoin.
SQL%ROWCOUNT