sql >> Database teknologi >  >> RDS >> Database

Sådan læser og fortolker du SQL-fejl

Fejlkoder i SQL genereres af serveren for at give information om, hvad der er gået galt. De har forskellige betydninger afhængigt af den SQL-version, du bruger, men de indikerer normalt manglende evne til at udføre en anmodet handling.

Den nemmeste måde at udforske det på er det enkleste programmeringssprog kaldet BASIC og dets programmer som "Hello world". Indtast følgende i grænsefladen:

PRINT "Hello, World!"

Hvis du skriver PRINT som PRRRR, får du en fejlmeddelelse (et tilsvarende i det virkelige liv ville være en, der fortæller dig at køre i højre side af vejen, f.eks. overholde reglerne).

Det er relativt nemt, når det kommer til simple operationer, men hvad med mere komplekse systemer? Vi inkluderer også SQL-kodeeksempler her. God fornøjelse!

Følgende kode importerer de nødvendige funktioner fra standardbiblioteket, opretter derefter en konsol, får en pointer til dens standardoutputstrøm og udskriver meddelelsen til denne strøm og frigiver objekter i brug:

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

Hvis du laver en fejl i denne kode, tager det et stykke tid at finde den, især hvis du har 500 sider kode som denne. Så computeren vil finde fejl og henvise dig til, hvor de er.

Hvad er SQL-fejlkoder til, og hvordan fungerer de?

Nytten af ​​SQL fejlkoder er, at softwaren finder din kode og peger på den (eksempel). Du behøver ikke selv at kontrollere tusindvis af kodelinjer manuelt. Forestil dig, at du kun får én fejlkode nogensinde ("Bedre held næste gang, taber!" eller "Hvem har lært dig at kode, en hest?") og at skulle gennemgå hele projektet igen!

På en måde er fejlkoder fremragende julemandens små hjælpere:klare, nyttige og spar masser af tid. Du skal bare lære dem at kende.

Fra det grundlæggende niveau er databaser samlinger af informationer sat sammen og klassificeret. Den type, vi er interesseret i, er relationsdatabaser, hvilket betyder, at der er relationer mellem de celler, dataene er lagret i.

Det kan for eksempel være, at du har en hel gruppe studerende på et universitet og gerne vil belønne alle, der fik mere end 90 % ved deres eksamen, med en præmie. Du kan manuelt skrive deres navne, køn, adresser, bankkontonumre (disse er alle relaterede, derfor relationelle databaser), karakterer og derefter manuelt vælge dem med høje scores.

Gammeldags? Ja, men du vil blive overrasket over at høre, hvor mange virksomheder der stadig driver forretning på denne måde i det 21. århundrede. Det kan tage måneder at fuldføre operationer, som ville tage en computer sekunder at udføre. Især hvis vi taler om hundredvis eller tusindvis af studerende.

Hvis du nu sætter alle disse elever i en database, kan du bruge et sprog som SQL:

SELECT * FROM Student WHERE Percentage>=90;

Færdig! Problemerne begynder dog, når du skriver din kode.

Det bliver forståeligt nok meget komplekst, så jo mere du skriver, jo større er chancerne for, at din kode indeholder fejl. Her vil fejlkoder være mest nyttige. Når vi ser fejlkoder, bør vi være taknemmelige (hvilket ikke forhindrer os i at bande til dem hver eneste gang). De gør alt arbejdet for dig, og alt hvad du skal gøre er at gå til kilden og løse problemet.

Giv mig nogle detaljer!

Når en database ikke giver de ønskede resultater, udsendes en fejlkode. Det hjælper med at identificere problemet og hvordan man løser det. SQL-fejlkoder, som dem nedenfor, vil være nyttige ved fejlfinding af eventuelle problemer med dine databaser:

Oracle9i-databasefejlmeddelelser

Udgivelse 2 (9.2)

ORA-00904:"angivet antal rækker overstiger maksimum".

ORA-00900:"Utilstrækkelige rettigheder på objekt".

ORA-00900:"ugyldig SQL-sætning".

ORA-00902:"ugyldig datatype".

Vi har mange forskellige typer fejl i SQL. Men hvis du ikke skal indramme dem og sætte dem på din væg, skal du vide, hvordan du skal håndtere dem. Det gode er, at SQL-fejl kommer med et link til den præcise placering af fejlen i en kode og giver også information om, hvad der er galt.

Lad os starte med det enkleste fejleksempel:

ORA-00900:"ugyldig SQL-sætning".

Som du sikkert har gættet, skal du skrive kommandoen ordentligt. Der kan være en tastefejl eller et komma et sted, hvor det ikke hører hjemme. Eller, alt efter omstændighederne, skal du muligvis installere yderligere software:

“Sætningen genkendes ikke som en gyldig SQL-sætning.

Denne fejl kan opstå, hvis Procedural Option ikke er installeret, og der udstedes en SQL-sætning, der kræver denne indstilling (f.eks. en CREATE PROCEDURE-sætning). Du kan afgøre, om den proceduremæssige mulighed er installeret ved at starte SQL*Plus. Hvis PL/SQL-banneret ikke vises, er indstillingen ikke installeret.

Handling:Ret syntaksen, eller installer den proceduremæssige indstilling".

Det samme gælder for typen af ​​formatering eller placering af forkerte datatyper, hvor de ikke hører hjemme:

ORA-00902 ugyldig datatype

“Årsag:Datatypen, der er indtastet i CREATE- eller ALTER TABLE-sætningen, er ikke gyldig.

Handling:Ret syntaksen".

Du kan finde flere oplysninger i Oracle-dokumentationen.

SQL-fejlkoder er den mest almindelige måde at fejlfinde SQL-forespørgsler på. Når du forespørger i databasen, og problemet opstår, genererer databasemotoren SQL-fejlkoden. Disse koder repræsenterer problemets placering i forespørgslen og giver programmører oplysninger om, hvordan de løser det, eller hvordan de fortolker, hvad der forårsagede det.

Hovedtyper af fejl

Formatfejl

For eksempel, når du bruger SELECT, skal du følge den med en bestemt rækkefølge (liste kolonnerne i tabellen, som indeholder vores elever og deres karakterer), derefter en stjerne. Hvis du ikke følger formatet, skal du skifte en stjerne og et komma rundt, så får du en fejlmeddelelse.

"hvis der er en BEGIN TRANSAKTION, skal den altid ende med en COMMIT eller ROLLBACK transaktion."

Et andet eksempel:efter FROM bruger du operatorer som WHERE, som kræver en betingelse. Det kan være en hvilken som helst betingelse, inklusive forhold, der udtrækker data, f.eks. alle elever med karakterer under 30. Hvis du lader dette felt stå tomt, får du en formatfejl.

Operatørfejl

Kommandoer skal være kompatible med SQL. Du kan ikke inkludere SUM og COUNT med WHERE. Ellers får du en fejl.

Procedurefejl

Procedurekode er den kode, der er gemt på serveren, som du kan bruge til dine formål med mindre ændringer.

“En lagret procedure er en forberedt SQL-kode, som du kan gemme, så koden kan genbruges igen og igen... Så hvis du har en SQL-forespørgsel, som du skriver igen og igen, skal du gemme den som en lagret procedure, og så bare kald det for at udføre det." ( W3-skoler )

At oprette en lagret procedure fra en tabel kaldet Kunder med alle dens optegnelser og eksekver den, har vi følgende kode:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Med andre ord er procedurer som skabeloner gemt på en server, som du kan tage, ændre og bruge efter behov.

Procedurefejl er mere eller mindre almindelige former for fejl. Forskellen er, at de ikke refererer til en enkelt kodelinje, men til hele proceduren (skabelonen), som du tog og forsøgte at ændre lidt.

Forestil dig, at du har to borde, et tomt og et fuldt. Du anvender nedenstående kode på den tomme tabel:

INSERT to transfer data
SELECT and WHERE to choose data

Et eksempel på en strategisk fejl ville være at bruge operatører som IN og NOT IN operatører. Det er fristende, men alligevel ikke særlig godt optimeret (brug af JOIN er et meget bedre strategisk valg).

Fatale og ikke-fatale fejl

En database som MySQL eller PostgreSQL gemmer data i tabeller, som er opbygget af rækker og kolonner. Databaseforespørgsler er SQL-kommandoer, der fortæller databasen, hvad den skal gøre med dens data. De kunne være så enkle som at vælge alle poster fra en tabel, eller komplekse nok til at oprette en helt ny tabel.

Der er to typer fejl, der kan opstå, når du bruger disse kommandoer:fatal og non-fatal.

En fatal fejl stopper udførelsen af ​​en sætning, mens en ikke-fatal fejl ikke gør det.

En fatal fejl er en databasefejl, der ikke kan rettes. En ikke-fatal fejl er et problem, der kan løses på en eller anden måde, for eksempel ved at genstarte SQL Server-tjenesten eller forekomsten af ​​SQL Server.

En database kan have både fatale og ikke-fatale fejl på et givet tidspunkt af mange årsager. Nogle gange, hvis du er opmærksom på problemet, er det muligt at løse det uden for meget besvær. Andre gange, ikke så meget.

Den mest almindelige type fejl er en syntaks eller et andet runtime-problem med databasesystemet, der tilgår data fra SQL-tabellen. Disse fejl kan fanges i test, før du kører koden. Du kan sikre, at alt fungerer korrekt, når det udføres mod databasesystemet.

Opret dine fejlkoder med RAISERROR

"Der er en RAISERROR-funktion, der kan bruges til at generere vores brugerdefinerede fejlmeddelelser, hvilket er en fantastisk måde at oversætte forvirrende fejlmeddelelser til noget, der er lidt mere meningsfuldt, som folk ville forstå."

RAISERROR-funktionen er en SQL-serversystemkommando, der kan frembringe en fejlmeddelelse. Du kan bruge den til at angive fejl, advarsler eller informationsmeddelelser.

Fejl kan være forårsaget af programmøren eller af SQL Server selv. Det er nyttigt til at give feedback, når noget går galt, men også når noget skal ske uden at afbryde udførelsen af ​​andre udsagn i batchen.

Brug følgende syntaks:

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

Du kan også anvende RAISERROR til enten at afslutte udførelsen af ​​en sætning eller til at videregive fejl genereret af SQL-sætninger til en anden applikation. Du kan f.eks. rejse en fejlmeddelelse, der vil få udførelsen af ​​den aktuelle batch eller sætning til at stoppe, samt vise den angivne meddelelse.

Den mest almindelige brug for RAISERROR er at generere en fejlmeddelelse, når data ikke opfylder nogle kriterier, såsom at indtaste for mange tegn i et felt, der kun tillader 50 tegn.

Raiserror(msg) er nyttig til at håndtere fejl, der opstår under behandlingen, og det kræver ikke, at hele transaktionen mislykkes på grund af en enkelt fejl.

Nu kan du oprette lige så mange fejl du vil. Glæd dig!

Håndtering af fejl

For at håndtere fejl skal vi være i stand til at kontrollere dem og finde ud af alle relaterede oplysninger. Det er nødvendigt for enhver sag, der er mere kompliceret end at skrive forkert PRINT i "Hello World".

En nyttig måde at fange fejl på er at bruge TRY…CATCH. Dette værktøj giver dig mulighed for at tage din kode og placere den i et miljø, hvor den kan undersøges og håndteres sikkert. Der kan du udtrække data fra den. Beslut om du vil rapportere fejlen, finde ud af mere om den eller rette den.

Denne SQL-serversandkasse går sådan her:

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

Koden du vil se er placeret mellem BEGIN TRY og END TRY. Hvis der sker fejl, sendes det til CATCH-erklæringen. Dette giver os en masse nyttig funktionalitet:

  • ERROR_NUMBER returnerer det interne nummer på fejlen
  • ERROR_STATE returnerer oplysningerne om kilden
  • ERROR_SEVERITY returnerer oplysningerne om alt fra informationsfejl til fejl, som brugere af DBA kan rette osv.
  • ERROR_LINE returnerer linjenummeret, hvor der skete en fejl på
  • ERROR_PROCEDURE returnerer navnet på den lagrede procedure eller funktion
  • ERROR_MESSAGE returnerer de vigtigste oplysninger, og det er meddelelsesteksten for fejlen.

Her er, hvad vi får, når vi prøver at dividere 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, er PRØV...FANG-funktionen meget nyttig.

Oversigt

Nu ved du præcis, hvad SQL-fejlkode er, hvilke typer fejl der er, hvorfor de opstår, hvordan de sandboxes og studeres, hvordan du opretter dine fejlsignaler osv. Du er langt mere end bare forberedt på at håndtere fejl! Hvis ikke, så lad os det vide, så udgiver vi flere guider i fremtiden. Held og lykke!


  1. mysql_real_escape_string VS addslashes

  2. ROWID (oracle) - nogen brug for det?

  3. En Ejendomsmægler Data Model

  4. UDENLANDSKE NØGLE PÅ SLETNINGSRESTRICT Fejl - Oracle