sql >> Databasteknik >  >> RDS >> Database

Hur man läser och tolkar SQL-fel

Felkoder i SQL genereras av servern för att ge information om vad som har gått fel. De har olika betydelser beroende på vilken SQL-version du använder, men de indikerar vanligtvis oförmågan att utföra en begärd operation.

Det enklaste sättet att utforska det är det enklaste programmeringsspråket som heter BASIC och dess program som "Hello world". Skriv in följande i gränssnittet:

PRINT "Hello, World!"

Om du skriver PRINT som PRRRR får du ett felmeddelande (en motsvarighet i verkligheten skulle vara någon som säger åt dig att köra på höger sida av vägen, t.ex. följa reglerna).

Det är relativt enkelt när det gäller enkla operationer, men hur är det med mer komplexa system? Vi inkluderar också exempel på SQL-kod här. Njut!

Följande kod importerar de nödvändiga funktionerna från standardbiblioteket, skapar sedan en konsol, får en pekare till dess standardutgångsström och skriver ut meddelandet till denna ström och släpper objekt som används:

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

Om du gör ett fel i den här koden tar det ett tag att hitta den, speciellt om du har 500 sidor kod som denna. Så datorn kommer att hitta fel och peka dig till var de är.

Vad är SQL-felkoder till för och hur fungerar de?

Nyttan med SQL-felkoder är att programvaran hittar din kod och pekar på den (exempel). Du behöver inte själv kontrollera tusentals kodrader manuellt. Föreställ dig att du bara får en felkod någonsin ("Bättre lycka nästa gång, förlorare!" eller "Vem lärde dig koda, en häst?") och att behöva gå igenom hela projektet igen!

På sätt och vis är felkoder utmärkta jultomtens små hjälpare:tydliga, användbara och spara massor av tid. Du måste bara lära känna dem.

Från och med den grundläggande nivån är databaser samlingar av information som sammanställs och klassificeras. Den typ vi är intresserade av är relationsdatabaser, vilket betyder att det finns relationer mellan cellerna som data lagras i.

Till exempel kan du ha en hel grupp studenter på ett universitet och vill belöna alla som fick mer än 90% på sina prov med ett pris. Du kan manuellt skriva deras namn, kön, adresser, bankkontonummer (dessa är alla relaterade, därav relationsdatabaser), betyg och sedan manuellt välja de med höga poäng.

Arkaisk? Ja, men du skulle bli förvånad över hur många företag som fortfarande gör affärer på det här sättet under 2000-talet. Det kan ta månader att slutföra operationer som skulle ta en dator sekunder att göra. Särskilt om vi pratar om hundratals eller tusentals studenter.

Om du nu lägger alla dessa elever i en databas kan du använda ett språk som SQL:

SELECT * FROM Student WHERE Percentage>=90;

Gjort! Problemen börjar dock när du skriver upp din kod.

Förståeligt nog blir det väldigt komplicerat, så ju mer du skriver, desto större är chansen att din kod innehåller fel. Här kommer felkoder att vara mest användbara. När vi ser felkoder bör vi vara tacksamma (vilket inte hindrar oss från att svära åt dem varje gång). De gör allt arbete åt dig, och allt du behöver göra är att gå till källan och åtgärda problemet.

Ge mig några detaljer!

När en databas misslyckas med att ge de önskade resultaten, kastas en felkod. Det hjälper till att identifiera problemet och hur man åtgärdar det. SQL-felkoder, som de nedan, kommer att vara användbara när du felsöker eventuella problem med dina databaser:

Oracle9i Database Felmeddelanden

Version 2 (9.2)

ORA-00904:"angivet antal rader överskrider max."

ORA-00900:"otillräckliga privilegier på objekt".

ORA-00900:"ogiltig SQL-sats".

ORA-00902:"ogiltig datatyp".

Vi har många olika typer av fel i SQL. Men om du inte ska rama in dem och sätta dem på din vägg måste du veta hur du ska hantera dem. Det som är bra är att SQL-fel kommer med en länk till den exakta platsen för felet i en kod och ger även information om vad som är fel.

Låt oss börja med det enklaste felexemplet:

ORA-00900:"ogiltig SQL-sats".

Som du säkert har gissat måste du skriva upp kommandot ordentligt. Det kan finnas ett stavfel eller kommatecken någonstans där det inte hör hemma. Eller, i förekommande fall, kan du behöva installera ytterligare programvara:

"Satsen känns inte igen som en giltig SQL-sats.

Det här felet kan uppstå om proceduralternativet inte är installerat och en SQL-sats utfärdas som kräver detta alternativ (till exempel en CREATE PROCEDURE-sats). Du kan avgöra om Proceduralternativet är installerat genom att starta SQL*Plus. Om PL/SQL-bannern inte visas är alternativet inte installerat.

Åtgärd:Korrigera syntaxen eller installera proceduralternativet.

Detsamma gäller typen av formatering eller att placera fel datatyper där de inte hör hemma:

ORA-00902 ogiltig datatyp

"Orsak:Datatypen som anges i CREATE- eller ALTER TABLE-satsen är inte giltig.

Åtgärd:Korrigera syntaxen.”

Du kan hitta mer information i Oracle-dokumentationen.

SQL-felkoder är det vanligaste sättet att felsöka SQL-frågor. När du frågar databasen och problemet uppstår, genererar databasmotorn SQL-felkoden. Dessa koder representerar platsen för problemet i frågan och ger programmerare information om hur man åtgärdar det eller hur man tolkar vad som orsakade det.

Huvudtyper av fel

Formatfel

Till exempel, när du använder SELECT måste du följa den med en viss sekvens (lista kolumnerna i tabellen, som innehåller våra elever och deras betyg), sedan en stjärna. Om du inte följer formatet, byter du en stjärna och ett kommatecken, får du ett felmeddelande.

"om det finns en BÖRJA TRANSAKTION måste den alltid sluta med en COMMIT- eller ROLLBACK-transaktion."

Ett annat exempel:efter FROM använder du operatorer som WHERE som kräver ett villkor. Det kan vara vilket villkor som helst, inklusive villkor som extraherar data, t.ex. alla elever med betyg under 30. Om du lämnar det här fältet tomt får du ett formatfel.

Operatorfel

Kommandon måste vara kompatibla med SQL. Du kan inte inkludera SUM och COUNT med WHERE. Annars får du ett felmeddelande.

Procedurfel

Procedurkod är koden som lagras på servern och som du kan använda för dina ändamål med mindre ändringar.

"En lagrad procedur är en förberedd SQL-kod som du kan spara, så koden kan återanvändas om och om igen... Så om du har en SQL-fråga som du skriver om och om igen, spara den som en lagrad procedur, och sedan är det bara att ringa det för att utföra det." ( W3-skolor )

Att skapa en lagrad procedur från en tabell som heter Kunder med alla dess poster och exekvera den har vi följande kod:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Med andra ord, procedurer är som mallar lagrade på en server som du kan ta, ändra och använda efter behov.

Procedurfel är mer eller mindre vanliga typer av fel. Skillnaden är att de inte refererar till en enda kodrad utan till hela proceduren (mallen) som du tog och försökte ändra något.

Föreställ dig att du har två bord, ett tomt och ett fullt. Du tillämpar koden nedan på den tomma tabellen:

INSERT to transfer data
SELECT and WHERE to choose data

Ett exempel på ett strategiskt fel skulle vara att använda operatorer som IN- och NOT IN-operatorer. Det är frestande men inte särskilt väl optimerat (att använda JOIN är ett mycket bättre strategiskt val).

Dödliga och icke-fatala fel

En databas som MySQL eller PostgreSQL lagrar data i tabeller, som består av rader och kolumner. Databasfrågor är SQL-kommandon som talar om för databasen vad den ska göra med dess data. De kan vara så enkla som att välja alla poster från en tabell, eller tillräckligt komplexa för att skapa en helt ny tabell.

Det finns två typer av fel som kan uppstå när du använder dessa kommandon:fatal och non-fatal.

Ett fatalt fel stoppar exekveringen av en sats, medan ett icke-fatalt fel inte gör det.

Ett fatalt fel är ett databasfel som inte kan åtgärdas. Ett icke-fatalt fel är ett problem som kan lösas på något sätt, till exempel genom att starta om SQL Server-tjänsten eller instansen av SQL Server.

En databas kan ha både fatala och icke-fatala fel vid varje given tidpunkt av många anledningar. Ibland, om du är medveten om problemet, är det möjligt att lösa det utan alltför stora svårigheter. Andra gånger, inte så mycket.

Den vanligaste typen av fel är ett syntax- eller annat körtidsproblem med databassystemet som kommer åt data från SQL-tabellen. Dessa fel kan fångas vid testning innan koden körs. Du kan se till att allt fungerar korrekt när det körs mot databassystemet.

Skapa dina felkoder med RAISERROR

"Det finns en RAISERROR-funktion som kan användas för att generera våra anpassade felmeddelanden vilket är ett utmärkt sätt att översätta förvirrande felmeddelanden till något lite mer meningsfullt som folk skulle förstå."

RAISERROR-funktionen är ett SQL-serversystemkommando som kan visa ett felmeddelande. Du kan använda den för att indikera fel, varningar eller informationsmeddelanden.

Fel kan orsakas av programmeraren eller av SQL Server själv. Det är användbart för att ge feedback när något går fel, men också när något behöver hända utan att avbryta exekveringen av andra påståenden i partiet.

Använd följande syntax:

RAISERROR ( [ error_number ] , [ message ], [ state ])

Du kan också använda RAISERROR för att antingen avsluta exekveringen av en sats eller för att vidarebefordra fel som genereras av SQL-satser till en annan applikation. Du kan till exempel visa ett felmeddelande som gör att körningen av den aktuella batchen eller satsen stoppas, samt visa det angivna meddelandet.

Den vanligaste användningen av RAISERROR är att generera ett felmeddelande när data inte uppfyller vissa kriterier, som att ange för många tecken i ett fält som bara tillåter 50 tecken.

Raiserror(msg) är användbart för att hantera fel som uppstår under bearbetning, och det kräver inte att hela transaktionen misslyckas på grund av ett enskilt fel.

Nu kan du skapa så många egna fel som du vill. Gläd dig!

Hantera fel

För att hantera fel måste vi kunna kontrollera dem och ta reda på all relaterad information. Det är nödvändigt för alla fall som är mer komplicerade än att skriva fel PRINT i "Hello World".

Ett användbart sätt att fånga fel är att använda TRY…CATCH. Detta verktyg låter dig ta din kod och placera den i en miljö där den kan undersökas och hanteras säkert. Där kan du extrahera data från den. Bestäm om du vill rapportera felet, ta reda på mer om det eller åtgärda det.

Denna SQL-serversandlåda ser ut så här:

BEGIN TRY  
 	--code to try
END TRY  
BEGIN CATCH  
 	--code to run if an error occurs
--is generated in try
END CATCH

Koden du vill titta på placeras mellan BEGIN TRY och END TRY. Om misstag inträffar skickas det till CATCH-satsen. Detta ger oss många användbara funktioner:

  • ERROR_NUMBER returnerar det interna numret för felet
  • ERROR_STATE returnerar informationen om källan
  • ERROR_SEVERITY returnerar information om allt från informationsfel till fel som användare av DBA kan fixa, etc.
  • ERROR_LINE returnerar radnumret där ett fel inträffade
  • ERROR_PROCEDURE returnerar namnet på den lagrade proceduren eller funktionen
  • ERROR_MESSAGE returnerar den viktigaste informationen och det är meddelandetexten för felet.

Det här är vad vi får när vi försöker dividera 1 med 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

Som du kan se är funktionen TRY…CATCH mycket användbar.

Sammanfattning

Nu vet du exakt vad SQL-felkod är, vilka typer av fel det finns, varför de inträffar, hur de är sandlådor och studerade, hur du skapar dina felsignaler, etc. Du är mycket mer än bara beredd att hantera fel! Om inte, låt oss veta, så släpper vi fler guider i framtiden. Lycka till!


  1. Kombinera två tabeller som inte har några gemensamma fält

  2. PGError:ERROR:aggregeringar är inte tillåtna i WHERE-satsen på en AR-fråga för ett objekt och dess has_many-objekt

  3. Vad betyder det att undkomma ett snöre?

  4. Hantera en PostgreSQL Commitfest