I codici di errore in SQL vengono generati dal server per fornire informazioni su cosa è andato storto. Hanno significati diversi a seconda della versione SQL che stai utilizzando, ma di solito indicano l'impossibilità di eseguire un'operazione richiesta.
Il modo più semplice per esplorarlo è il linguaggio di programmazione più semplice chiamato BASIC e i suoi programmi come "Hello world". Digita quanto segue nell'interfaccia:
PRINT "Hello, World!"
Se digiti PRINT come PRRRR, riceverai un messaggio di errore (un equivalente nella vita reale sarebbe qualcuno che ti dice di guidare sul lato destro della strada, ad esempio rispettando le regole).
È relativamente facile quando si tratta di operazioni semplici, ma per quanto riguarda i sistemi più complessi? Includiamo anche esempi di codice SQL qui. Divertiti!
Il codice seguente importa le funzioni necessarie dalla libreria standard, quindi crea una console, ottiene un puntatore al relativo flusso di output standard, stampa il messaggio su questo flusso e rilascia gli oggetti in uso:
Option Explicit
Declare Function AllocConsole Lib "kernel32" () As Long
Declare Function FreeConsole Lib "kernel32" () As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
(ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
lpReserved As Any) As Long
Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long
Private Sub Main()
'create a console instance
AllocConsole
'get handle of console output
Dim hOut As Long
hOut = GetStdHandle(-11&)
'output string to console output
Dim s As String
s = "Hello, World!" & vbCrLf
WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
'make a pause to look at the output
Sleep 2000
'close the handle and destroy the console
CloseHandle hOut
FreeConsole
End Sub
Se commetti un errore in questo codice, ci vuole un po' per trovarlo, soprattutto se hai 500 pagine di codice come questo. Quindi, il computer troverà gli errori e ti indirizzerà dove si trovano.
A cosa servono i codici di errore SQL e come funzionano?
L'utilità dei codici di errore SQL è che il software trova il codice e lo punta (esempio). Non devi controllare manualmente migliaia di righe di codice da solo. Immagina di ricevere un solo codice di errore per sempre ("Maggiore fortuna la prossima volta, perdente!" o "Chi ti ha insegnato a programmare, un cavallo?") e di dover rivedere l'intero progetto di nuovo!
In un certo senso, i codici di errore sono ottimi aiutanti di Babbo Natale:chiari, utili e fanno risparmiare un sacco di tempo. Devi solo conoscerli.
A partire dal livello di base, le banche dati sono raccolte di informazioni messe insieme e classificate. Il tipo che ci interessa sono i database relazionali, il che significa che ci sono relazioni tra le celle in cui sono archiviati i dati.
Ad esempio, potresti avere un intero gruppo di studenti in un'università e voler premiare tutti coloro che hanno ottenuto più del 90% agli esami con un premio. Potresti scrivere manualmente i loro nomi, sesso, indirizzi, numeri di conto bancario (questi sono tutti correlati, quindi database relazionali), voti e quindi scegliere manualmente quelli con punteggi più alti.
Arcaico? Sì, ma saresti sorpreso di sapere quante aziende continuano a fare affari in questo modo nel 21° secolo. Potrebbero volerci mesi per completare operazioni che richiederebbero pochi secondi per essere eseguite da un computer. Soprattutto se parliamo di centinaia o migliaia di studenti.
Ora, mettendo tutti questi studenti in un database potresti usare un linguaggio come SQL:
SELECT * FROM Student WHERE Percentage>=90;
Fatto! I problemi, tuttavia, iniziano quando scrivi il tuo codice.
Comprensibilmente diventa molto complesso, quindi più scrivi, maggiori sono le possibilità che il tuo codice contenga errori. Qui, i codici di errore saranno molto utili. Quando vediamo codici di errore, dovremmo essere grati (il che non ci impedisce di imprecare su di essi ogni singola volta). Fanno tutto il lavoro per te e tutto ciò che devi fare è andare alla fonte e risolvere il problema.
Dammi qualche dettaglio!
Quando un database non riesce a produrre i risultati desiderati, viene generato un codice di errore. Aiuta a identificare il problema e come risolverlo. I codici di errore SQL, come quelli riportati di seguito, saranno utili durante la risoluzione di eventuali problemi con i database:
Messaggi di errore del database Oracle9i
Versione 2 (9.2)
ORA-00904:"il numero specificato di righe supera il massimo".
ORA-00900:"privilegi insufficienti sull'oggetto".
ORA-00900:"istruzione SQL non valida".
ORA-00902:"tipo di dati non valido".
Abbiamo molti diversi tipi di errori in SQL. Ma se non hai intenzione di incorniciarli e appenderli al muro, devi sapere come affrontarli. La cosa buona è che gli errori SQL vengono forniti con un collegamento alla posizione precisa dell'errore in un codice e forniscono anche informazioni su ciò che non va.
Iniziamo con l'esempio di errore più semplice:
ORA-00900:"istruzione SQL non valida".
Come probabilmente avrai intuito, devi scrivere correttamente il comando. Potrebbe esserci un errore di battitura o una virgola da qualche parte a cui non appartiene. Oppure, a seconda dei casi, potrebbe essere necessario installare software aggiuntivo:
"L'istruzione non è riconosciuta come un'istruzione SQL valida.
Questo errore può verificarsi se l'opzione procedurale non è installata e viene emessa un'istruzione SQL che richiede questa opzione (ad esempio, un'istruzione CREATE PROCEDURE). È possibile determinare se l'opzione procedurale è installata avviando SQL*Plus. Se il banner PL/SQL non viene visualizzato, l'opzione non è installata.
Azione:correggi la sintassi o installa l'opzione procedurale”.
Lo stesso vale per il tipo di formattazione o per inserire tipi di dati errati dove non appartengono:
Tipo di dati ORA-00902 non valido
"Causa:il tipo di dati immesso nell'istruzione CREATE o ALTER TABLE non è valido.
Azione:correggi la sintassi”.
Puoi trovare maggiori informazioni nella documentazione Oracle.
I codici di errore SQL sono il modo più comune per eseguire il debug di query SQL. Ogni volta che si interroga il database e si verifica il problema, il motore di database genera il codice di errore SQL. Questi codici rappresentano la posizione del problema nella query e forniscono ai programmatori informazioni su come risolverlo o su come interpretarne la causa.
Principali tipi di errore
Errori di formato
Ad esempio, quando usi SELECT, devi seguirlo con una certa sequenza (elenca le colonne nella tabella, che contiene i nostri studenti e i loro voti), quindi una stella. Se non segui il formato, scambia una stella e una virgola, riceverai un messaggio di errore.
"se c'è una BEGIN TRANSACTION, deve sempre terminare con una transazione COMMIT o ROLLBACK."
Un altro esempio:dopo FROM si usano operatori come WHERE che richiedono una condizione. Può essere qualsiasi condizione, comprese le condizioni che estraggono dati, ad esempio tutti gli studenti con voti inferiori a 30. Se lasci vuoto questo campo, riceverai un errore di formato.
Errore operatore
I comandi devono essere compatibili con SQL. Si puo' includere SUM e COUNT con DOVE. In caso contrario, viene visualizzato un errore.
Errori procedurali
Il codice procedurale è il codice memorizzato sul server che puoi utilizzare per i tuoi scopi con lievi modifiche.
"Una procedura memorizzata è un codice SQL preparato che puoi salvare, in modo che il codice possa essere riutilizzato più e più volte... Quindi, se hai una query SQL che scrivi più e più volte, salvala come procedura memorizzata, e poi chiamalo per eseguirlo. ( Scuole W3 )
Per creare una procedura memorizzata da una tabella denominata Clienti con tutti i suoi record ed eseguirlo, abbiamo il seguente codice:
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
EXEC SelectAllCustomers;
In altre parole, le procedure sono come modelli archiviati su un server che puoi prendere, modificare e utilizzare secondo necessità.
Gli errori procedurali sono tipi più o meno usuali di errori. La differenza è che non si riferiscono a una singola riga di codice ma all'intera procedura (modello) che hai preso e provato a modificare leggermente.
Immagina di avere due tavoli, uno vuoto e uno pieno. Applichi il codice seguente alla tabella vuota:
INSERT to transfer data
SELECT and WHERE to choose data
Un esempio di errore strategico sarebbe l'utilizzo di operatori come IN e NOT IN. È allettante ma non molto ben ottimizzato (usare JOIN è una scelta strategica molto migliore).
Errori fatali e non fatali
Un database come MySQL o PostgreSQL memorizza i dati in tabelle, che sono composte da righe e colonne. Le query del database sono comandi SQL che indicano al database cosa fare con i suoi dati. Potrebbero essere semplici come selezionare tutti i record da una tabella o abbastanza complessi da creare una tabella completamente nuova.
Esistono due tipi di errori che possono verificarsi durante l'utilizzo di questi comandi:fatale e non fatale.
Un errore fatale interrompe l'esecuzione di un'istruzione, mentre un errore non fatale no.
Un errore irreversibile è un errore del database che non può essere corretto. Un errore non irreversibile è un problema che può essere risolto in qualche modo, ad esempio riavviando il servizio SQL Server o l'istanza di SQL Server.
Un database può avere errori fatali e non fatali in qualsiasi momento per molte ragioni. A volte, se sei a conoscenza del problema, è possibile risolverlo senza troppe difficoltà. Altre volte, non così tanto.
Il tipo più comune di errore è una sintassi o un altro problema di runtime con il sistema di database che accede ai dati dalla tabella SQL. Questi errori possono essere rilevati durante il test prima di eseguire il codice. Puoi assicurarti che tutto funzioni correttamente quando eseguito sul sistema di database.
Creazione dei tuoi codici di errore con RAISERROR
"Esiste una funzione RAISERROR che può essere utilizzata per generare i nostri messaggi di errore personalizzati, che è un ottimo modo per tradurre messaggi di errore confusi in qualcosa di un po' più significativo che le persone possano capire."
La funzione RAISERROR è un comando di sistema del server SQL che può generare un messaggio di errore. Puoi usarlo per indicare errori, avvisi o messaggi informativi.
Gli errori possono essere causati dal programmatore o dallo stesso SQL Server. È utile per fornire feedback quando qualcosa va storto, ma anche quando è necessario che qualcosa accada senza interrompere l'esecuzione di altre istruzioni nel batch.
Usa la seguente sintassi:
RAISERROR ( [ error_number ] , [ message ], [ state ])
È inoltre possibile applicare RAISERROR per terminare l'esecuzione di un'istruzione o per trasferire gli errori generati dalle istruzioni SQL a un'altra applicazione. Ad esempio, puoi generare un messaggio di errore che interromperà l'esecuzione del batch o dell'istruzione corrente, oltre a visualizzare il messaggio specificato.
L'uso più comune di RAISERROR è generare un messaggio di errore quando i dati non soddisfano alcuni criteri, come l'immissione di troppi caratteri in un campo che consente solo 50 caratteri.
Raiserror(msg) è utile per gestire gli errori che si verificano durante l'elaborazione e non richiede il fallimento dell'intera transazione a causa di un singolo errore.
Ora puoi creare tutti gli errori che desideri. Gioisci!
Gestire gli errori
Per affrontare gli errori, dobbiamo essere in grado di controllarli e scoprire tutte le relative informazioni. È necessario in ogni caso più complicato dell'errata digitazione di PRINT in "Hello World".
Un modo utile per rilevare gli errori è usare TRY…CATCH. Questo strumento ti consente di prendere il tuo codice e inserirlo in un ambiente in cui può essere esaminato e gestito in sicurezza. Lì, puoi estrarre i dati da esso. Decidi se vuoi segnalare l'errore, saperne di più o risolverlo.
Questa sandbox del server SQL funziona così:
BEGIN TRY
--code to try
END TRY
BEGIN CATCH
--code to run if an error occurs
--is generated in try
END CATCH
Il codice che vuoi guardare è posizionato tra BEGIN TRY e END TRY. Se si verificano errori, viene inviato all'istruzione CATCH. Questo ci fornisce molte funzionalità utili:
- ERROR_NUMBER restituisce il numero interno dell'errore
- ERROR_STATE restituisce le informazioni sulla fonte
- ERROR_SEVERITY restituisce le informazioni su qualsiasi cosa, dagli errori informativi agli errori che gli utenti di DBA possono correggere, ecc.
- ERROR_LINE restituisce il numero di riga in cui si è verificato un errore
- PROCEDURA_ERRORE restituisce il nome della procedura o della funzione memorizzata
- ERROR_MESSAGE restituisce le informazioni più essenziali e questo è il testo del messaggio dell'errore.
Ecco cosa otteniamo quando proviamo a dividere 1 per 0:
USE AdventureWorks2014
GO
-- Basic example of TRY...CATCH
BEGIN TRY
-- Generate a divide-by-zero error
SELECT
1 / 0 AS Error;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_STATE() AS ErrorState,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
Come puoi vedere, la funzione PROVA…CATCH è molto utile.
Riepilogo
Ora sai esattamente cos'è il codice di errore SQL, quali tipi di errori ci sono, perché si verificano, come vengono inseriti in sandbox e studiati, come creare i segnali di errore, ecc. Sei molto più che preparato a gestire gli errori! In caso contrario, faccelo sapere e rilasceremo altre guide in futuro. Buona fortuna!