SQLSTATE è una funzione di stato del database che restituisce un tipo
di dati CHARACTER composto da 5 caratteri con il valore predefinito
'00000' (cinque zeri come una stringa).
All'interno di un flusso di messaggi, è possibile accedere ed
aggiornare una risorsa del database esterno utilizzando le funzioni del
database ESQL disponibili nei nodi Filter, Database e Compute. Quando si effettuano le chiamate ad un database esterno, è possibile che
vengano visualizzati degli errori, come tabella inesistente, database non
disponibile oppure un inserimento per una chiave già esistente.
Quando si verificano tali errori, l'azione predefinita del broker è
quella di generare un'eccezione. Tale funzionamento è determinato dal modo in cui è impostata la proprietà
Genera eccezione in caso di errore
database. Se si seleziona questa casella di spunta, il broker
termina l'elaborazione del nodo, propaga il messaggio al terminale di errore
del nodo e scrive i dettagli dell'errore in ExceptionList. Se si desidera
ignorare il funzionamento predefinito e gestire un errore del database nel
codice ESQL nel nodo, annullare la selezione della casella di spunta
Genera eccezione in caso di errore
database. Il broker non genera alcuna eccezione ed è necessario
includere l'istruzione THROW per generare un'eccezione se un determinato codice
di stato SQL non è previsto. Consultare Istruzione THROW per una
descrizione di THROW.
Se si desidera gestire gli errori del database
in un nodo, è possibile utilizzare la funzione di stato del database SQLSTATE
per ricevere informazioni relative allo stato della chiamata DBMS eseguita in ESQL. E' possibile includerla in istruzioni condizionali nel codice ESQL del nodo
corrente per riconoscere e gestire possibili errori.
Stati SQL
In
ESQL, gli stati SQL sono stringhe di caratteri di lunghezza variabile. Per convenzione, tali stringhe contengono 6 caratteri compresi tra 0 e 9 ed A e
Z. Di seguito è riportato il significato dei sei caratteri:
- Carattere 1
- Origine dell'eccezione
- Caratteri 2 - 3
- Classe dell'eccezione
- Caratteri 4 - 6
- Sottoclasse dell'eccezione
Lo stato SQL di un'eccezione è determinato da un
processo in due fasi. Nella prima fase, le informazioni relative all'eccezione vengono
esaminate e tutte le eccezioni secondarie (le informazioni che indicano
l'operazione eseguita dal broker nel momento in cui si è verificata
l'eccezione) vengono ignorate fino a quando viene individuata l'eccezione che
descrive l'errore originario.
La
seconda fase è riportata di seguito:
- Se l'eccezione selezionata è un'eccezione del database, lo stato SQL è
quello fornito dal database preceduto dalla lettera
"D" per evitare confusione con le eccezioni generate nel broker. Il codice SQL, l'errore nativo ed il testo dell'errore sono quelli forniti dal
database.
- Se l'eccezione selezionata è un'eccezione dell'utente (generata in
un'istruzione THROW), il codice SQL, lo stato, l'errore nativo ed il testo
dell'errore vengono presi, nell'ordine, dai primi quattro inserimenti
dell'eccezione. Il valore di stato risultante viene utilizzato così come viene fornito (non
viene preceduto da alcuna lettera, come, ad esempio, "U"). In realtà, la
lettera "U" non è utilizzata dal broker come un indicatore di origine.
Se si intende definire uno stato SQL univoco piuttosto che imitare uno stato esistente, è
consigliato l'utilizzo di stati SQL che iniziano con la lettera "U". Scegliere di seguire
questa indicazione, la presenza della lettera "U" consente a un programma di gestione di associare tutte le eccezioni generate e definite dall'utente a un operatore LIKE’U%’.
- Se l'eccezione selezionata ha avuto origine nella trasmissione del
messaggio o nell'implementazione ESQL, il codice SQL, lo stato, l'errore nativo
ed il testo dell'errore sono quelli descritti nell'elenco riportato di
seguito.
- Per tutte le altre eccezioni, lo stato SQL è
'', che indica nessuna origine, nessuna classe e nessuna classe
secondaria.
Alcune eccezioni che forniscono attualmente uno stato SQL vuoto
potrebbero fornire stati singoli in rilasci futuri. Se si desidera catturare eccezioni non classificate, utilizzare il carattere
wildcard "tutto" ("%") per lo stato SQL nell'ultimo programma di
gestione di un ambito. Questo continuerà a catturare la stessa serie di eccezioni se alle eccezioni
precedentemente non classificate vengono forniti nuovi stati SQL univoci.
Sono definiti i seguenti stati SQL:
- Dddddd
- ddddd è lo stato restituito dal database.
- SqlState = ‘S22003'
- Overflow aritmetico. Un'operazione il cui risultato è un tipo numerico
risultato in un valore non compreso nell'intervallo supportato.
- SqlState = ‘S22004’
- Valore null non consentito. Era presente un valore null in un punto in cui
non sono consentiti valori null.
- SqlState = ‘S22007’
- Formato data/ora non valido. Una stringa di caratteri utilizzata in un cast
da tipo character a tipo
date-time aveva il formato di base errato (ad esempio, '01947-10-24') oppure
valori non compresi negli intervalli consentiti dal calendario Gregoriano (ad
esempio,
'1947-21-24').
- SqlState = ‘S22008’
- Overflow del campo della data e dell'ora. Un'operazione il cui risultato
è un tipo date/time ha restituito un valore non compreso nell'intervallo
supportato.
- SqlState = ‘S22011’
- Errore SUBSTRING. I parametri FROM e FOR, insieme alla lunghezza del primo
operando, violano le regole della funzione SUBSTRING.
- SqlState = ‘S22012’
- Divisione per zero. Un'operazione di divisione il cui tipo di dati del
risultato non ha il concetto di infinito aveva l'operando di destra uguale a
zero.
- SqlState = ‘S22015’
- Overflow del campo dell'intervallo. Un'operazione il cui risultato è di
tipo INTERVAL ha restituito un valore non compreso nell'intervallo supportato
del tipo di dati INTERVAL.
- SqlState = ‘S22018’
- Valore character non valido per il cast.
- SqlState = ‘SPS001’
- Terminale di destinazione non valido. Un'istruzione PROPAGATE al terminale
ha provato ad utilizzare un nome di terminale non valido.
- SqlState = ‘SPS002’
- Etichetta di destinazione non valida. Un'istruzione PROPAGATE
all'etichetta ha provato ad utilizzare un'etichetta non valida.
- SqlState = 'MQW001', SqlNativeError = 0
- Il flusso di bit non soddisfa i requisiti per i messaggi MQ. Non è stato eseguito alcun tentativo di inserirlo in una coda. Questo problema non viene risolto in caso di nuovo tentativo e di gestione
della coda.
- SqlState = 'MQW002', SqlNativeError = 0
- I nomi del gestore code o della coda di destinazione non erano validi (non
possono essere convertiti da unicode alla code page del gestore code). Questo problema non viene risolto se si riprova e si svuota la coda.
- SqlState = 'MQW003', SqlNativeError = 0
- E' stata specificata la modalità di richiesta, ma i nomi del gestore
code o della coda
"di risposta" non erano validi (non è stato possibile eseguire la
conversione da unicode alla code page del messaggio). Questo problema non viene risolto se si riprova e si svuota la coda.
- SqlState = 'MQW004', SqlNativeError = 0
- E' stata specificata la modalità di risposta ma i nomi del gestore code o
della coda presi dal messaggio non erano validi (non possono essere
convertiti dalla code page fornita ad unicode). Questo problema non viene risolto se si riprova e si svuota la coda.
- SqlState = 'MQW005', SqlNativeError = 0
- E' stata specificata la modalità dell'elenco di destinazione, ma
l'elenco di destinazione fornito non soddisfa i requisiti di base per
gli elenchi di destinazione. Non è stato eseguito alcun tentativo di inserire un messaggio in una coda. Questo problema non viene risolto in caso di nuovo tentativo e di gestione
della coda.
- SqlState = 'MQW101', SqlNativeError = come restituito da MQ
- Impossibile aprire la coda o il gestore code di destinazione. La gestione della coda potrebbe consentire di risolvere questo problema, che
non può essere risolto riprovando.
- SqlState = 'MQW102', SqlNativeError = come restituito da MQ
- Impossibile scrivere nella coda o nel gestore code di destinazione. Questo problema potrebbe essere risolto riprovando oppure mediante la gestione
della coda.
- SqlState = 'MQW201', SqlNativeError = numero di destinazioni con un
errore
- Si è verificato più di un errore durante l'elaborazione di un elenco di
destinazione. Il messaggio può essere stato inserito in zero o più code. Questo problema potrebbe essere risolto riprovando oppure mediante la gestione
della coda.
- Elementi utilizzati dall'utente in un'istruzione THROW
- Utilizzare
Uuuuuuu per le eccezioni utente, a meno che non venga imitata
una delle eccezioni sopra definite.
- Stringa vuota
- Tutti gli altri errori.