Questione : Trattamento delle eccezioni ed afferrare i messaggi di errore di Oracle

Ciao tipi,

Given uno scritto qui sotto:

ScriptName: InsRecOnMytable.sql
--------------------------------
ERR_MSG VARCHAR2 (4000) del



DECLARE;
SCRT_NAME VARCHAR2 (400): = “InsRecOnMytable.sql„; inserto del


BEGIN

nei valori del
di myschema.mytable (SCHEMA, NOME, OSSERVAZIONE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETARIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) (tabella mytable„ e “del campione„ 1 “di myschema„, “, “TABELLA„, “BASIC„, “PRODUCT„, “PRODUCT„, 0, “Sample 1„, posizione di segnale minimo); inserto del

nei valori del
di myschema.mytable (SCHEMA, NOME, OSSERVAZIONE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETARIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) (tabella mytable„ e “del campione„ 2 “di myschema„, “, “TABELLA„, “BASIC1„, “PRODUCT1„, “PRODUCT1„, 1, “Sample 2„, posizione di segnale minimo); il

commette;
GrabErr (SCRT_NAME, “successo ") del
;

END SE;

EXCEPTION
QUANDO DUP_VAL_ON_INDEX ALLORA  -- le annotazioni del duplicato delle maniglie il
del error
che seleziona i msg duplicato dell'inserto in ERR_MSG da doppio;

GrabErr (SCRT_NAME, ERR_MSG); -- una procedura che prende il ERR_MSG come
del parameter
QUANDO ALTRI ALLORA  -- tratta tutti i altri msg prescelti del errors
è derivato dal above> duplicato dell'inserto in ERR_MSG da doppio;

GrabErr (SCRT_NAME, ERR_MSG); -- una procedura che prende il ERR_MSG come RIDUZIONE DEI PREZZI del
del parameter
;
END; il bisogno del
/

I appena un senso potere passare o immagazzinare using una variabile il messaggio di errore reale di ORACLE è derivato dall'annotazione del duplicato qui sopra e più d'importanza, la linea numero in cui l'errore si è presentato per lo scritto di ricerca degli errori purposes.

the di cui sopra è un'idea soltanto. Ritenere che libero di suggerire qualunque è la migliore soluzione via la lima di CEPPO di PL/SQL.

Using funzionerà ma l'idea qui sia che la procedura di GrabErr aggiornerà alcune colonne su una tabella dice SCRIPTINFO che contiene i particolari per ogni scritto che è eseguito. Se ci è un senso generare la lima di CEPPO ed allo stesso tempo essere alambicco in grado per aggiornare la tabella di SCRIPTINFO, allora così tanto better.


qualcosa di simile:
--------------------


SCRIPTINFO TABLE
----------------l'oracolo
ID EXEC_STATUS REMARKS
===========================================================================
1 erra msg.>
2 MyScriptInsert.sql Success
===========================================================================


Can che qualcosa di simile be è fatto?

Thanks in anticipo,
jrmn
class= del

Risposta : Trattamento delle eccezioni ed afferrare i messaggi di errore di Oracle

Il vostro codice è GIUSTO, ma suggerirei alcuni cambiamenti:

Non ci è bisogno di fare questo:
selezionare in ERR_MSG a partire da doppio;
L'errore è in queste variabili: SQLCODE e SQLERRM, così

ECCEZIONE
   QUANDO DUP_VAL_ON_INDEX ALLORA  -- il duplicato delle maniglie registra l'errore

       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
      RIDUZIONE DEI PREZZI;   -- Ho aggiunto questo perché in una procedura GrabErr ci deve essere TRANSAZIONE AUTONOMA

   QUANDO ALTRI ALLORA  -- tratta tutti gli altri errori
       
       GrabErr (SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       RIDUZIONE DEI PREZZI;
ESTREMITÀ;

Nella TRANSAZIONE AUTONOMA di uso di GrabErr di procedura.
Potete anche definire i vostri propri errori di applicazione.
Qui è più circa il trattamento di eccezioni:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014

Se volete conoscere la linea in cui l'errore accade allora aggiungere un n_debug di variabile per esempio:

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

COMINCIARE
    n_debug: =1;
  Inserto in myschema.mytable (SCHEMA, NOME, OSSERVAZIONE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETARIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     valori (“il myschema„, “mytable„, “tabella 1 del campione„, “TABELLA„, “BASIC„, “PRODOTTO„, “PRODOTTO„, 0, “prova 1„, posizione di segnale minimo);

    n_debug: =2;

  Inserto in myschema.mytable (SCHEMA, NOME, OSSERVAZIONE, ORACLE_TYPE, FUNCTIONAL_TYPE, PROPRIETARIO, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME)
     valori (“il myschema„, “mytable„, “tabella 2 del campione„, “TABELLA„, “BASIC1„, “PRODUCT1„, “PRODUCT1„, 1, “prova 2„, posizione di segnale minimo);

    n_debug: =3;
  commettere;

 
  GrabErr (n_debug, SCRT_NAME, “successo ");

CONCLUDER SE;

ECCEZIONE
        GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
       RIDUZIONE DEI PREZZI;

   QUANDO ALTRI ALLORA  -- tratta tutti gli altri errori
       
       GrabErr (n_debug, SCRT_NAME, SQLCODE||' '||SQLERRM);
   
       RIDUZIONE DEI PREZZI;
ESTREMITÀ;

La faccio questo senso. Potete anche generare una procedura con il parametro SCRT_NAME dell'input ed anziché lo scritto potete seguire la procedura.

Spero che questo sia un poco aiuto per voi.
Altre soluzioni  
 
programming4us programming4us