Fråga : Bruk av undantag och gripa Oracle felmeddelanden

Hi grabbar,

Given en nedanför skriva:

ScriptName: InsRecOnMytable.sql
--------------------------------
ERR_MSG VARCHAR2 (4000) för



DECLARE;
SCRT_NAME VARCHAR2 (400): = ”InsRecOnMytable.sql”; mellanlägget för


BEGIN

in i
för myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 1”, ”BORDLÄGGER”, ”GRUNDLÄGGANDE”, ”PRODUCT”, ”PRODUCT”, 0, ”Sample 1” som, är ogiltig); mellanlägget för

in i
för myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 2”, ”BORDLÄGGER”, ”BASIC1”, ”PRODUCT1”, ”PRODUCT1”, 1, ”Sample 2” som, är ogiltig);

begår;
GrabErr (SCRT_NAME, ”framgångar) för
;

END OM;

EXCEPTION
NÄR DUP_VAL_ON_INDEX DÄREFTER  -- handtagdubblettrekord
som för error
väljer msg en in i ERR_MSG från dubbel;

GrabErr (SCRT_NAME, ERR_MSG); -- ett tillvägagångssätt som tar ERR_MSGEN som
för parameter
NÄR ANDRA DÄREFTER  -- behandlar alla andra msg för errors
valda resulterade från dubblettmellanläggsabove>en in i ERR_MSG från dubbel;

GrabErr (SCRT_NAME, ERR_MSG); -- ett tillvägagångssätt som tar ERR_MSGEN som ROLLBACK för
för parameter
;
END; behov a för
/

I precis långt att vara kompetent att passera eller lagra using en variabel det faktiska ORACLE felmeddelandet resulterade från dubblettrekord över, och huvudsakligen, fodra numrerar var felet uppstod för feltestning purposes.

the skrivar är över en idé endast. Känselförnimmelsen frigör för att föreslå, att allt vad är den bäst lösningen via PL/SQL.

Using, LOGGA sparar ska arbete, men idén här är att GrabErr tillvägagångssättet ska uppdateringen som några kolonner på innehålla för bordlägganågot att säga SCRIPTINFO specificerar för varje skrivar utförande. Om det finns a långt som skapar LOGGA, spara och var samtidigt den kompetent stillbilden som uppdaterar SCRIPTINFO, bordlägger, då så mycket något liknande för better.


Something detta:
--------------------


SCRIPTINFO TABLE
----------------DET KÄNDA EXEC_STATUS REMARKS
===========================================================================
1 InsRecOnMytable.sql MISSADE
ID felar msg.>
2 MyScriptInsert.sql REKO Success
===========================================================================


Can något något liknande som detta göras?

Thanks i förskott,
jrmn
" klar "

Svar : Bruk av undantag och gripa Oracle felmeddelanden

Ditt kodifiera är REKO, men jag skulle rekommenderar några ändringar:

Det finns inte något behov av att göra detta:
välj in i ERR_MSG från dubbel;
Felet är i dessa variabler: SQLCODE och SQLERRM, så

UNDANTAG
   NÄR DUP_VAL_ON_INDEX DÄREFTER  -- handtagdubblett antecknar fel

       GrabErr (SCRT_NAME, SQLCODE||' ',||SQLERRM);
      ROLLBACK;   -- Jag har tillfogat denna, därför att i ett tillvägagångssätt GrabErr det ought att finnas den AUTONOMA TRANSAKTIONEN

   NÄR ANDRA DÄREFTER  -- behandlar alla andra fel
       
       GrabErr (SCRT_NAME, SQLCODE||' ',||SQLERRM);
   
       ROLLBACK;
AVSLUTA;

I den AUTONOMA TRANSAKTIONEN för tillvägagångssättGrabErr bruk.
Du kan också definiera dina egna applikationfel.
Är här mer om undantagsbruk:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014

Om du önskar att veta fodra var felet uppstår därefter, tillfoga en variabele.g. n_debug:

FÖRKLARA
SCRT_NAME VARCHAR2 (400): = ”InsRecOnMytable.sql”;
    n_debug PLS_INTEGER: =0;

BÖRJA
    n_debug: =1;
  Mellanlägg in i myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 1”, ”BORDLÄGGER”, ”GRUNDLÄGGANDE”, ”PRODUKTEN”, ”PRODUKTEN”, 0, ”tar prov 1”, ogiltigt);

    n_debug: =2;

  Mellanlägg in i myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 2”, ”BORDLÄGGER”, ”BASIC1”, ”PRODUCT1”, ”PRODUCT1”, 1, ”tar prov 2”, ogiltigt);

    n_debug: =3;
  begå;

 
  GrabErr (n_debug, SCRT_NAME, ”framgångar);

AVSLUTA OM;

UNDANTAG
        GrabErr (n_debug, SCRT_NAME, SQLCODE||' ',||SQLERRM);
       ROLLBACK;

   NÄR ANDRA DÄREFTER  -- behandlar alla andra fel
       
       GrabErr (n_debug, SCRT_NAME, SQLCODE||' ',||SQLERRM);
   
       ROLLBACK;
AVSLUTA;

Jag gör den hitåt. Du kan också skapa ett tillvägagångssätt med matar in parametern SCRT_NAME, och i stället för skriva dig kan använda tillvägagångssättet.

Jag hoppas ska denna är lite en hjälp för dig.
Andra lösningar  
 
programming4us programming4us