Vraag : Behandelende Uitzonderingen en het Grijpen Oracle foutenmeldingen

Hallo Kerels,

Given een manuscript hieronder:

ScriptName: InsRecOnMytable.sql




DECLARE
ERR_MSG VARCHAR2 (4000);
SCRT_NAME VARCHAR2 (400): = „InsRecOnMytable.sql“; /> Tussenvoegsel


BEGIN

_TYPE, FUNCTIONAL_TYPE, EIGENAAR, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
waarden myschema.mytable („myschema“, „mytable“, „steekproeflijst 1“, „LIJST“, „BASIC“, „PRODUCT“, „PRODUCT“, 0, „Sample 1“, verklaart nietig); /> Tussenvoegsel

_TYPE, FUNCTIONAL_TYPE, EIGENAAR, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
waarden myschema.mytable („myschema“, „mytable“, „steekproeflijst 2“, „LIJST“, „BASIC1“, „PRODUCT1“, „PRODUCT1“, 1, „Sample 2“, verklaart nietig);

begaat;

GrabErr (SCRT_NAME, „Succes“);

END ALS;

EXCEPTION
WANNEER DUP_VAL_ON_INDEX TOEN  -- het handvatten duplicaat registreert error

uitgezochte in ERR_MSG van dubbel voortvloeide;

GrabErr (SCRT_NAME, ERR_MSG); -- een procedure die ERR_MSG als parameter

WANNEER ANDEREN DAN neemt  -- behandelt al andere errors

uitgezochte in ERR_MSG van dubbel voortvloeide;

GrabErr (SCRT_NAME, ERR_MSG); -- een procedure die ERR_MSG als parameter

TERUGSCHROEVEN VAN PRIJZEN neemt;
END;
/

I vergt enkel een manier het gebruiken van een variabele kunnen overgaan of opslaan de daadwerkelijke foutenmelding van ORACLE hierboven uit dubbel verslag voortvloeide en wat nog belangrijker is, is het lijnaantal waar de fout voor hierboven het zuiveren van manuscript purposes.

the voorkwam een slechts idee. Voel vrij om voor te stellen wat de beste oplossing via PL/SQL.

Using- LOGBOEK is zal werken maar het idee is hier dat de procedure GrabErr sommige kolommen op een lijst zegt SCRIPTINFO bevattend de details die voor elk manuscript bijwerken zal worden uitgevoerd. Als er een manier is om het dossier van het LOGBOEK te creëren en tezelfdertijd Scriptinfo- lijst nog te kunnen bijwerken, toen zo veel better.


iets in die aard:



SCRIPTINFO TABLE


ID de NAAM EXEC_STATUS REMARKS
===========================================================================
1 InsRecOnMytable.sql ONTBRAK
2 MyScriptInsert.sql O.K. Success
===========================================================================


Can iets in die aard worden gedaan?

Thanks vooraf,
jrmn

Antwoord : Behandelende Uitzonderingen en het Grijpen Oracle foutenmeldingen

Uw code is O.K., maar ik zou sommige veranderingen adviseren:

Er is geen behoefte om dit te doen:
selecteer in ERR_MSG van dubbel;
De fout is in deze variabelen: SQLCODE en SQLERRM, zo

UITZONDERING
   WANNEER DUP_VAL_ON_INDEX TOEN  -- het handvatten duplicaat registreert fout

       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
      Het TERUGSCHROEVEN VAN PRIJZEN;   -- Ik heb dit toegevoegd omdat in een procedure GrabErr er AUTONOME TRANSACTIE zou moeten zijn

   WANNEER ANDEREN TOEN  -- behandelt alle andere fouten
       
       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       Het TERUGSCHROEVEN VAN PRIJZEN;
EIND;

In de het gebruiks AUTONOME TRANSACTIE van procedureGrabErr.
U kunt uw eigen toepassingsfouten ook bepalen.
Hier is meer over uitzondering die behandelt:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014

Als u de lijn wilt kennen waar de fout toen voorkomt voeg een variabele toe b.v. n_debug:

VERKLAAR
SCRT_NAME VARCHAR2 (400): = „InsRecOnMytable.sql“;
    n_debug PLS_INTEGER: =0;

BEGIN
    n_debug: =1;
  TUSSENVOEGSEL IN MYSCHEMA.MYTABLE (SCHEMA, NAAM, OPMERKING, ORACLE_TYPE, FUNCTIONAL_TYPE, EIGENAAR, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     waarden („myschema“, „mytable“, „steekproeflijst 1“, „LIJST“, „BASIC“, „PRODUCT“, „PRODUCT“, 0, „Steekproef 1“, verklaart nietig);

    n_debug: =2;

  TUSSENVOEGSEL IN MYSCHEMA.MYTABLE (SCHEMA, NAAM, OPMERKING, ORACLE_TYPE, FUNCTIONAL_TYPE, EIGENAAR, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     waarden („myschema“, „mytable“, „steekproeflijst 2“, „LIJST“, „BASIC1“, „PRODUCT1“, „PRODUCT1“, 1, „Steekproef 2“, verklaart nietig);

    n_debug: =3;
  bega;

 
  GrabErr (n_debug, SCRT_NAME, „Succes“);

EIND ALS;

UITZONDERING
        GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
       Het TERUGSCHROEVEN VAN PRIJZEN;

   WANNEER ANDEREN TOEN  -- behandelt alle andere fouten
       
       GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       Het TERUGSCHROEVEN VAN PRIJZEN;
EIND;

Ik doe het deze manier. U kunt een procedure met inputparameter SCRT_NAME ook tot stand brengen en in plaats van manuscript kunt u de procedure gebruiken.

Ik hoop dit een kleine hulp voor u zal zijn.
Andere oplossingen  
 
programming4us programming4us