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;
4 Réponses :
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.):
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 b> 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.
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;
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
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;
/