Istruzione DECLARE HANDLER

L'istruzione DECLARE HANDLER crea un programma di gestione degli errori per la gestione delle eccezioni.

SINTASSI

E' possibile dichiarare i programmi di gestione in ambiti dichiarati in modo esplicito (BEGIN...END) e dichiarati in modo implicito (ad esempio, la clausola ELSE di un'istruzione IF). Tuttavia, tutte le dichiarazioni del programma di gestione devono essere insieme all'inizio dell'ambito, prima di qualsiasi altra istruzione.

Se non si verificano eccezioni, la presenza dei programmi di gestione non ha alcun effetto sul funzionamento o sulle prestazioni di un programma SQL. Se si verifica un'eccezione, WebSphere Message Broker confronta lo stato SQL dell'eccezione con gli stati SQL associati ai programmi di gestione, fino a quando l'eccezione lascia il nodo (come se non esistessero programmi di gestione) oppure viene rilevato un programma di gestione corrispondente. All'interno di qualsiasi ambito, la ricerca dei programmi di gestione viene eseguita nell'ordine in cui essi sono dichiarati; vale a dire, dal primo all'ultimo. La ricerca negli ambiti viene effettuata a partire da quello più interno verso quello più esterno.

I valori dello stato SQL forniti nelle istruzioni DECLARE... HANDLER... possono essere confrontati direttamente con lo stato SQL dell'eccezione oppure possono essere confrontati utilizzando caratteri wildcard. Per confrontare direttamente i valori dello stato, specificare VALUE oppure nessun operatore di condizione. Per eseguire un confronto mediante caratteri wildcard, utilizzare i caratteri di sottolineatura e di percentuale per rappresentare rispettivamente caratteri singoli e multipli e specificare l'operatore LIKE. Il metodo con caratteri wildcard consente di gestire tutte le eccezioni di tipo generale senza doverle elencare dettagliatamente.

Se viene rilevato un programma di gestione corrispondente, SQLSTATE e gli altri registri speciali vengono aggiornati (in base alle regole descritte di seguito) e l'istruzione del programma di gestione viene elaborata.

Poiché l'istruzione del programma di gestione deve essere un'istruzione singola, è generalmente un'istruzione composta (come ad esempio BEGIN...END) che contiene altre istruzioni. Non è associato alcun funzionamento particolare a tali istruzioni interne e non esistono particolari limitazioni. Ad esempio, esse possono includere RETURN, ITERATE o LEAVE; tali istruzioni influiscono sulle routine e sui loop nello stesso modo in cui influirebbero se fossero contenute nell'ambito.

I programmi di gestione possono contenere programmi di gestione per le eccezioni che si verificano all'interno del programma di gestione stesso

Se l'elaborazione del codice del programma di gestione viene completata senza generare ulteriori eccezioni non gestite, l'esecuzione del normale codice viene ripresa come riportato di seguito:
  • Per i programmi di gestione EXIT, l'istruzione successiva elaborata è la prima istruzione dopo l'ambito del programma di gestione.
  • Per i programmi di gestione CONTINUE, è la prima istruzione direttamente contenuta dopo quella che ha generato l'eccezione.

Ciascun programma di gestione dispone dei propri registri speciali SQLCODE, SQLSTATE, SQLNATIVEERROR e SQLERRORTEXT. Tali registri entrano nell'ambito ed i relativi valori vengono impostati appena prima che venga eseguita la prima istruzione del programma di gestione. Essi restano validi fino a quando viene eseguita l'ultima istruzione del programma di gestione. Poiché i valori SQLSTATE non vengono portati da un programma di gestione all'altro, è possibile scrivere i programmi di gestione in modo indipendente.

I programmi di gestione assorbono le eccezioni, impedendo loro di raggiungere il nodo di input e causando il commit piuttosto che il rollback della transazione. Per impedire ciò, un programma di gestione può utilizzare un'istruzione RESIGNAL o THROW.

Esempio

-- Drop the tables so that they can be recreated with the latest definition.
-- If the program has never been run before, errors will occur because you
-- can't drop tables that don't exist. We ignore these.
  BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE LIKE'%' BEGIN END;

    PASSTHRU 'DROP TABLE Shop.Customers' TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Invoices'  TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Sales'     TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Parts'     TO Database.DSN1;
  END;
Concetti correlati
Panoramica di ESQL
Attività correlate
Sviluppo di ESQL
Riferimenti correlati
Istruzione RESIGNAL
Diagrammi di sintassi: tipi disponibili
Istruzioni ESQL
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak20700_