2 votes

Nhibernate TooManyRowsAffectedException Oracle

Il y a un déclencheur sur une table qui crée périodiquement une insertion et génère l'exception TooManyRowsAffectedException. Dans Sql Server, nous pouvons définir le déclencheur sur NoCount pour résoudre le problème. Des idées pour Oracle?

FluentNHibernate 2.12 .net 4.7.2 Oracle 11g

-1voto

Roberto Hernandez Points 4307

Je pense que vous parlez de deux choses différentes:

SET NOCOUNT ON

Arrête le message qui montre le nombre de lignes affectées par une déclaration Transact-SQL ou une procédure stockée de retourner en tant que partie de l'ensemble de résultats. Lorsque SET NOCOUNT est activé, le compte n'est pas retourné. Lorsque SET NOCOUNT est désactivé, le compte est retourné.

Je suppose que vous parlez de l'exception Too_Many_Rows dans Oracle, car l'exception TooManyRowsAffectedException de Hibernate indique que plus de lignes ont été affectées que prévu. Indique généralement la présence de valeurs "PK" en double dans la table donnée.

L'exception TOO_MANY_ROWS (ORA-01422) se produit lorsqu'une déclaration SELECT INTO retourne plus d'une ligne.

Une exception dans Oracle est gérée dans un programme PL/SQL dans la section des exceptions, qui a son équivalent dans SQL Server avec le TRY CATCH.

Lorsqu'un programme Oracle contient un bloc d'exception, vous pouvez contrôler la sortie de l'une des nombreuses erreurs spécifiques en changeant le résultat de celles-ci, vous pouvez donc contrôler ce que le programme doit faire quand une erreur se produit. Une exception est essentiellement une expression logique qui répond à une question simple: que faites-vous quand une erreur se produit?

exception 
quand ... alors ...

Laissez-moi vous montrer un exemple

SQL> create table t ( c1 number , c2 number ) ;

Table créée.

SQL> alter table t add primary key (c1) ;

Table modifiée.

SQL> set timing off
SQL> declare
     begin
       insert into t values ( 1 , 1 );
       commit ;
       insert into t values ( 1 , 2 );
       commit;
    exception
      when dup_val_on_index alors null;
      when others alors raise;
   fin;
   /

Procédure PL/SQL terminée avec succès.

SQL> select * from t ;

        C1         C2
---------- ----------
         1          1

Comme vous pouvez le voir ci-dessus dans cet exemple, j'ai simplement contrôlé l'exception dup_val_on_index pour éviter que le programme ne génère une erreur. J'aurais pu faire de même pour une exception too_many_rows.

Fondamentalement, si vous voulez ignorer l'exception, vous pouvez modifier le code dans votre déclencheur pour éviter qu'une erreur ne soit déclenchée lorsque l'exception se produit. Vous pouvez également désactiver le déclencheur, mais je suppose que cela pourrait ne pas être une option.

Vous devez simplement réaliser que les deux choses sont différentes. SET NOCOUNT ON empêche l'envoi du message des lignes affectées au programme client. Une exception en Oracle PL/SQL est utilisée pour contrôler et gérer une erreur spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X