Frage : Behandlung von Ausnahmen und Ergreifung der Oracle-Fehlermeldungen

Hallo Kerle,

Given ein Index unten:

ScriptName: InsRecOnMytable.sql
--------------------------------



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


BEGIN

Einsatz in myschema.mytable (SCHEMA, NAME, ANMERKUNG, ORACLE_TYPE, FUNCTIONAL_TYPE, INHABER, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
Werte („myschema“, „mytable“, „Beispieltabelle 1“, „TABELLE“, „BASIC“, „PRODUCT“, „PRODUCT“, 0, „Sample 1“, Null);

Einsatz in myschema.mytable (SCHEMA, NAME, ANMERKUNG, ORACLE_TYPE, FUNCTIONAL_TYPE, INHABER, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
Werte („myschema“, „mytable“, „Beispieltabelle 2“, „TABELLE“, „BASIC1“, „PRODUCT1“, „PRODUCT1“, 1, „Sample 2“, Null);

legen fest;

GrabErr (SCRT_NAME, „Erfolg ");

END WENN;

EXCEPTION
WENN DUP_VAL_ON_INDEX DANN  -- Handgriffduplikataufzeichnungen error
, das
Msg in ERR_MSG von Doppel;

GrabErr (SCRT_NAME, ERR_MSG); -- ein Verfahren, das das ERR_MSG als parameter

WENN ANDERE DANN nimmt  -- behandelt alle weiteren errors

auserwählten Msg in ERR_MSG von Doppel;

GrabErr (SCRT_NAME, ERR_MSG); -- ein Verfahren, das das ERR_MSG als parameter

PREISSENKUNG nimmt;
END;
/

I gerade Notwendigkeit eine Weise, in der Lage zu sein, using eine Variable zu überschreiten oder zu speichern die tatsächliche ORACLE-Fehlermeldung resultierte aus Duplikataufzeichnung oben und wichtiger, ist die Linie Zahl, in der die Störung für den oben genannten Index der Entstörung purposes.

the auftrat, nur eine Idee. Glauben, dass frei, vorzuschlagen, was auch immer die beste Lösung über PL/SQL.

Using Protokolldatei arbeitet ist, aber die Idee hier ist, dass das GrabErr Verfahren einige Spalten auf einer Tabelle sagen SCRIPTINFO aktualisiert, welches die Details für jeden Index enthält, der durchgeführt wird. Wenn es eine Weise gibt, die Protokolldatei herzustellen und gleichzeitig die fähige Stille zu sein, zum der SCRIPTINFO Tabelle zu aktualisieren, dann soviel better.


etwas Ähnliches:
--------------------


SCRIPTINFO TABLE
----------------

ID NAMENSEXEC_STATUS REMARKS
===========================================================================
1 InsRecOnMytable.sql VERLASSENES
2 MyScriptInsert.sql OKAYSuccess
===========================================================================


Can, das etwas Ähnliches getan wird?

Thanks im Voraus,
jrmn

Antwort : Behandlung von Ausnahmen und Ergreifung der Oracle-Fehlermeldungen

Ihr Code ist OKAY, aber ich empfehlen etwas Änderungen:

Es gibt keine Notwendigkeit des Handelns dies:
in ERR_MSG von Doppel vorwählen;
Die Störung ist in diesen Variablen: SQLCODE und SQLERRM, so

AUSNAHME
   WENN DUP_VAL_ON_INDEX DANN  -- Handgriffduplikat notiert Störung

       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
      PREISSENKUNG;   -- Ich addiert dieses, weil in einem Verfahren GrabErr es AUTONOME VERHANDLUNG geben soll

   WENN ANDERE DANN  -- behandelt alle weiteren Störungen
       
       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       PREISSENKUNG;
ENDE;

In der Verfahren GrabErr Gebrauch AUTONOMEN VERHANDLUNG.
Sie können Ihre eigenen Anwendungsstörungen auch definieren.
Ist hier mehr über die Ausnahmebehandlung:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014

Wenn Sie die Linie kennen möchten, in der Störung dann auftritt, ein Variable z.B. addieren n_debug:

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

ANFANGEN
    n_debug: =1;
  Einsatz in myschema.mytable (SCHEMA, NAME, ANMERKUNG, ORACLE_TYPE, FUNCTIONAL_TYPE, INHABER, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     Werte („myschema“, „mytable“, „Beispieltabelle 1“, „TABELLE“, „BASIC“, „PRODUKT“, „PRODUKT“, 0, „probieren 1“, Null);

    n_debug: =2;

  Einsatz in myschema.mytable (SCHEMA, NAME, ANMERKUNG, ORACLE_TYPE, FUNCTIONAL_TYPE, INHABER, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     Werte („myschema“, „mytable“, „Beispieltabelle 2“, „TABELLE“, „BASIC1“, „PRODUCT1“, „PRODUCT1“, 1, „probieren 2“, Null);

    n_debug: =3;
  festlegen;

 
  GrabErr (n_debug, SCRT_NAME, „Erfolg ");

BEENDEN WENN;

AUSNAHME
        GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
       PREISSENKUNG;

   WENN ANDERE DANN  -- behandelt alle weiteren Störungen
       
       GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       PREISSENKUNG;
ENDE;

Ich tue es auf diese Weise. Sie können ein Verfahren mit Eingangsparameter SCRT_NAME auch verursachen und anstelle vom Index können Sie das Verfahren verwenden.

Ich hoffe, dass dieses eine wenig Hilfe für Sie ist.
Weitere Lösungen  
 
programming4us programming4us