10
votes

Gérer des exceptions oracle

J'ai besoin de gérer le erreur ORA-01400 (ne peut pas insérer null dans ("Schéma". "Nom de table". "Nom de colonne")) À l'aide d'une poignée d'exception.

Oracle prédéfinit quelques exceptions comme (Access_into_null, zero_divide, etc.), mais apparemment ne définit pas une exception pour l'erreur ORA-01400 , comment puis-je gérer ce code d'erreur particulier? P>

J'ai besoin de quelque chose comme ça (d'autres suggestions sont acceptées). P>

....
 ...     
 INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);
 COMMIT;
   EXCEPTION
     WHEN NULL_VALUES THEN /* i don't know this value , exist?*/
       Do_MyStuff();
     WHEN OTHERS THEN
       raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE); 
    END;


0 commentaires

4 Réponses :


2
votes

Vous pouvez définir vos propres exceptions, comme les variables (elles auront la même portée que d'autres variables afin que vous puissiez définir une exception de paquet, etc.): xxx


7 commentaires

Vincent, je le savais déjà, le problème de cette solution est que j'ai besoin de définir une exception pour chaque table. Je cherche un moyen de servir pour n'importe quelle table dans mon schéma.


Créer un déclencheur de niveau de schéma, pour gérer cette exception personnalisée


@Rruz: Je ne comprends pas vraiment, vous pouvez utiliser cette exception avec n'importe quelle table. Si vous le définissez dans une en-tête d'emballage, vous pouvez l'utiliser partout (I-E: Ce sera exactement comme une exception Oracle prédéfinie)


Je pense que la pièce manquante consiste à examiner le SQLERRM pour trouver la table / colonne qui provoque l'exception.


@Adam, je ne suis pas intéressé par la table / colonne, ce qui cause l'exception, j'ai besoin de gérer cette exception particulière comme Oracle fait avec les exceptions prédéfinies.


Ok ... je pense que je l'obtiens. Vous ne voulez pas avoir à déclarer l'exception dans chaque bloc PL / SQL ... Vous voulez le déclarer une fois et l'avoir "connu" à l'échelle du système?


Oui @adam, quelque chose comme ça.



3
votes

Vous pouvez gérer exception par son code comme celui-ci:

....
 ...
 INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);   
 COMMIT;   
   EXCEPTION   
     WHEN OTHERS THEN   
       IF SQLCODE = -1400 THEN
         Do_MyStuff();
       ELSE
         raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE);
       END IF;
    END;   


0 commentaires

-1
votes
 INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);
 COMMIT;  

      EXCEPTION
         WHEN NULL_VALUES /* i don't know this value , exist?*/
           emesg := SQLERRM;
           dbms_output.put_line(emesg); 
         WHEN OTHERS THEN
           emesg := SQLERRM;
           dbms_output.put_line(emesg);
         END;
SQLERRM shows the sql error message http://www.psoug.org/reference/exception_handling.html

0 commentaires

14
votes

Les exceptions PL / SQL prédéfinies sont spéciales em> à Oracle. Vous ne pouvez vraiment pas gâcher avec ceux-ci. Lorsque vous souhaitez avoir un ensemble d'exceptions prédéfinies de votre choix, vous ne pouvez pas les déclarer «globalement» comme les standards. Au lieu de cela, créez un package exceptions em> qui possède toutes les déclarations d'exception et utilisez-le dans votre code Application em>.

Exemple: P>

CREATE OR REPLACE PROCEDURE use_an_exception AS
BEGIN
  -- application specific code ...
  NULL;
EXCEPTION
  WHEN my_exceptions.insert_null_into_notnull THEN
     -- application specific handling for ORA-01400: cannot insert NULL into (%s)
     RAISE;
END;
/


0 commentaires