Votre code est CORRECT, mais je recommanderais quelques changements : Il n'y a aucun besoin de faire ceci : choisir dans ERR_MSG à partir de duel ; L'erreur est dans ces variables : SQLCODE et SQLERRM, ainsi
EXCEPTION QUAND DUP_VAL_ON_INDEX ALORS -- la reproduction de poignées enregistre l'erreur
GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM) ; BAISSE DE PRIX ; -- J'ai ajouté ceci parce que d'un procédé GrabErr il doit y avoir TRANSACTION AUTONOME
QUAND D'AUTRES ALORS -- manipule toutes autres erreurs GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM) ; BAISSE DE PRIX ; EXTRÉMITÉ ;
Dans la TRANSACTION AUTONOME d'utilisation de GrabErr de procédé. Vous pouvez également définir vos propres erreurs d'application. Voici plus au sujet de la manipulation d'exception : http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014
Si vous voulez connaître la ligne où l'erreur se produit alors ajouter un n_debug de variable par exemple :
DÉCLARER SCRT_NAME VARCHAR2 (400) : = « InsRecOnMytable.sql » ; n_debug PLS_INTEGER : =0 ;
COMMENCER n_debug : =1 ; Insertion dans myschema.mytable (SCHÉMA, NOM, REMARQUE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIÉTAIRE, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) valeurs (le « myschema », « mytable », le « tableau 1 témoin », « TABLE », « BASIC », « PRODUIT », « PRODUIT », 0, « prélèvent 1 », nulle) ;
n_debug : =2 ;
Insertion dans myschema.mytable (SCHÉMA, NOM, REMARQUE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIÉTAIRE, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) valeurs (le « myschema », « mytable », le « tableau 2 témoin », « TABLE », « BASIC1 », « PRODUCT1 », « PRODUCT1 », 1, « prélèvent 2 », nulle) ;
n_debug : =3 ; commettre ;
GrabErr (n_debug, SCRT_NAME, « succès ") ;
FINIR SI ;
EXCEPTION GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM) ; BAISSE DE PRIX ;
QUAND D'AUTRES ALORS -- manipule toutes autres erreurs GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM) ; BAISSE DE PRIX ; EXTRÉMITÉ ;
Je la fais de cette façon. Vous pouvez également créer un procédé avec le paramètre SCRT_NAME d'entrée et au lieu du manuscrit vous pouvez employer le procédé.
J'espère que ce sera une peu d'aide pour vous.
|