sql >> Database >  >> RDS >> Database

SQL-fouten lezen en interpreteren

Foutcodes in SQL worden door de server gegenereerd om informatie te geven over wat er is misgegaan. Ze hebben verschillende betekenissen, afhankelijk van de SQL-versie die u gebruikt, maar ze geven meestal aan dat een gevraagde bewerking niet kan worden uitgevoerd.

De gemakkelijkste manier om het te verkennen is de eenvoudigste programmeertaal genaamd BASIC en zijn programma's zoals "Hallo wereld". Typ het volgende in de interface:

PRINT "Hello, World!"

Als je PRINT typt als PRRRR, krijg je een foutmelding (een equivalent in het echte leven zou iemand zijn die je vertelt aan de rechterkant van de weg te rijden, bijvoorbeeld door je aan de regels te houden).

Dat is relatief eenvoudig als het gaat om eenvoudige bewerkingen, maar hoe zit het met complexere systemen? We nemen hier ook voorbeelden van SQL-code op. Geniet ervan!

De volgende code importeert de benodigde functies uit de standaardbibliotheek, maakt vervolgens een console, krijgt een verwijzing naar de standaarduitvoerstroom en drukt het bericht naar deze stroom af, en geeft de gebruikte objecten vrij:

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

Als u een fout maakt in deze code, duurt het even voordat u deze kunt vinden, vooral als u 500 pagina's met dergelijke code heeft. De computer zal dus fouten vinden en u verwijzen naar waar ze zijn.

Waar zijn SQL-foutcodes voor en hoe werken ze?

Het nut van SQL-foutcodes is dat de software uw code vindt en ernaar verwijst (voorbeeld). U hoeft zelf niet duizenden coderegels handmatig te controleren. Stel je voor dat je ooit maar één foutcode krijgt ("Volgende keer meer geluk, loser!" of "Wie heeft je geleerd hoe te coderen, een paard?") en het hele project opnieuw te moeten doorlopen!

In zekere zin zijn foutcodes uitstekende kleine helpers van de kerstman:duidelijk, nuttig en veel tijdwinst. Je moet ze gewoon leren kennen.

Beginnend op het basisniveau zijn databases verzamelingen van informatie die zijn samengesteld en geclassificeerd. Het type waarin we geïnteresseerd zijn, zijn relationele databases, wat betekent dat er relaties zijn tussen de cellen waarin de gegevens zijn opgeslagen.

Je hebt bijvoorbeeld een hele groep studenten op een universiteit en wilt iedereen die meer dan 90% behaalde op hun examens een prijs geven. Je zou handmatig hun namen, geslachten, adressen, bankrekeningnummers (deze zijn allemaal gerelateerd, dus relationele databases), cijfers kunnen schrijven en dan handmatig degene met hoge scores kunnen kiezen.

archaïsch? Ja, maar het zou je verbazen hoeveel bedrijven in de 21e eeuw nog steeds op deze manier zaken doen. Het kan maanden duren om bewerkingen te voltooien die een computer in seconden zou kosten. Vooral als we het hebben over honderden of duizenden studenten.

Als je nu al deze studenten in een database plaatst, zou je een taal als SQL kunnen gebruiken:

SELECT * FROM Student WHERE Percentage>=90;

Klaar! De problemen beginnen echter wanneer u uw code schrijft.

Het is begrijpelijk dat het erg complex wordt, dus hoe meer je schrijft, hoe groter de kans dat je code fouten bevat. Hier zijn foutcodes het nuttigst. Als we foutcodes zien, moeten we dankbaar zijn (wat ons er niet van weerhoudt om er elke keer tegen te vloeken). Zij doen al het werk voor u en u hoeft alleen maar naar de bron te gaan en het probleem op te lossen.

Geef me wat details!

Wanneer een database niet de gewenste resultaten oplevert, wordt een foutcode gegenereerd. Het helpt bij het identificeren van het probleem en hoe het op te lossen. SQL-foutcodes, zoals de onderstaande, zijn handig bij het oplossen van problemen met uw databases:

Oracle9i Database-foutmeldingen

Release 2 (9,2)

ORA-00904:"het opgegeven aantal rijen overschrijdt het maximum".

ORA-00900:"onvoldoende rechten op object".

ORA-00900:“ongeldige SQL-instructie”.

ORA-00902:"ongeldig gegevenstype".

We hebben veel verschillende soorten fouten in SQL. Maar als je ze niet gaat inlijsten en aan je muur hangen, moet je weten hoe je ermee om moet gaan. Het goede is dat SQL-fouten een link bevatten naar de exacte locatie van de fout in een code en ook informatie geven over wat er mis is.

Laten we beginnen met het eenvoudigste voorbeeld van een fout:

ORA-00900:“ongeldige SQL-instructie”.

Zoals je waarschijnlijk al geraden hebt, moet je de opdracht correct opschrijven. Er kan een typfout of een komma staan ​​waar deze niet thuishoort. Of, al naar gelang het geval, moet u mogelijk extra software installeren:

“De instructie wordt niet herkend als een geldige SQL-instructie.

Deze fout kan optreden als de procedurele optie niet is geïnstalleerd en er een SQL-instructie wordt uitgegeven die deze optie vereist (bijvoorbeeld een CREATE PROCEDURE-instructie). U kunt bepalen of de procedurele optie is geïnstalleerd door SQL*Plus te starten. Als de PL/SQL-banner niet wordt weergegeven, is de optie niet geïnstalleerd.

Actie:Corrigeer de syntaxis of installeer de procedurele optie”.

Hetzelfde geldt voor het type opmaak of het plaatsen van verkeerde gegevenstypen waar ze niet thuishoren:

ORA-00902 ongeldig gegevenstype

“Oorzaak:het gegevenstype dat is ingevoerd in de instructie CREATE of ALTER TABLE is niet geldig.

Actie:Corrigeer de syntaxis”.

U kunt meer informatie vinden in de Oracle-documentatie.

SQL-foutcodes zijn de meest gebruikelijke manier om SQL-query's te debuggen. Telkens wanneer u de database doorzoekt en het probleem zich voordoet, genereert de database-engine de SQL-foutcode. Deze codes vertegenwoordigen de locatie van het probleem in de zoekopdracht en geven programmeurs informatie over hoe ze het probleem kunnen oplossen of hoe ze kunnen interpreteren wat de oorzaak is.

Belangrijkste soorten fouten

Formaatfouten

Als je bijvoorbeeld SELECT gebruikt, moet je het volgen met een bepaalde volgorde (vermeld de kolommen in de tabel, die onze studenten en hun cijfers bevatten), en vervolgens een ster. Als je het formaat niet volgt, een ster en een komma omwisselt, krijg je een foutmelding.

"Als er een BEGIN TRANSACTIE is, moet deze altijd eindigen met een COMMIT- of ROLLBACK-transactie."

Nog een voorbeeld:na FROM gebruik je operators zoals WHERE waarvoor een voorwaarde vereist is. Het kan elke voorwaarde zijn, inclusief voorwaarden die gegevens extraheren, bijvoorbeeld alle studenten met cijfers onder de 30. Als je dit veld leeg laat, krijg je een opmaakfout.

Operatorfout

Opdrachten moeten compatibel zijn met SQL. U kunt SUM en COUNT opnemen met WHERE. Anders krijg je een foutmelding.

Procedurefouten

Procedurecode is de code die op de server is opgeslagen en die u met kleine wijzigingen voor uw doeleinden kunt gebruiken.

"Een opgeslagen procedure is een voorbereide SQL-code die u kunt opslaan, zodat de code steeds opnieuw kan worden gebruikt ... Dus als u een SQL-query hebt die u steeds opnieuw schrijft, sla deze dan op als een opgeslagen procedure, en dan gewoon bellen om het uit te voeren.” ( W3-scholen )

Een opgeslagen procedure maken van een tabel met de naam Klanten met al zijn records en voer het uit, we hebben de volgende code:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Met andere woorden, procedures zijn als sjablonen die op een server zijn opgeslagen en die u naar behoefte kunt nemen, wijzigen en gebruiken.

Procedurefouten zijn min of meer gebruikelijke soorten fouten. Het verschil is dat ze niet verwijzen naar een enkele regel code, maar naar de hele procedure (sjabloon) die je hebt genomen en enigszins hebt proberen te wijzigen.

Stel je voor dat je twee tafels hebt, een lege en een volle. Je past de onderstaande code toe op de lege tabel:

INSERT to transfer data
SELECT and WHERE to choose data

Een voorbeeld van een strategische fout is het gebruik van operators zoals IN en NOT IN operators. Het is verleidelijk maar niet erg goed geoptimaliseerd (join gebruiken is een veel betere strategische keuze).

Fatale en niet-fatale fouten

Een database zoals MySQL of PostgreSQL slaat gegevens op in tabellen, die zijn opgebouwd uit rijen en kolommen. Databasequery's zijn SQL-opdrachten die de database vertellen wat ze met de gegevens moeten doen. Ze kunnen zo simpel zijn als het selecteren van alle records uit een tabel, of complex genoeg om een ​​geheel nieuwe tabel te maken.

Er zijn twee soorten fouten die kunnen optreden bij het gebruik van deze commando's:fataal en niet-fataal.

Een fatale fout stopt de uitvoering van een instructie, terwijl een niet-fatale fout dat niet doet.

Een fatale fout is een databasefout die niet kan worden verholpen. Een niet-fatale fout is een probleem dat op de een of andere manier kan worden opgelost, bijvoorbeeld door de SQL Server-service of het exemplaar van SQL Server opnieuw te starten.

Een database kan om verschillende redenen op elk moment zowel fatale als niet-fatale fouten bevatten. Soms, als u op de hoogte bent van het probleem, is het mogelijk om het zonder al te veel moeite op te lossen. Andere keren niet zo veel.

Het meest voorkomende type fout is een syntaxis- of ander runtime-probleem met het databasesysteem dat toegang heeft tot gegevens uit de SQL-tabel. Deze fouten kunnen worden ontdekt tijdens het testen voordat de code wordt uitgevoerd. U kunt ervoor zorgen dat alles correct werkt wanneer het wordt uitgevoerd tegen het databasesysteem.

Uw foutcodes maken met RAISERROR

"Er is een RAISERROR-functie die kan worden gebruikt om onze aangepaste foutmeldingen te genereren, wat een geweldige manier is om verwarrende foutmeldingen te vertalen in iets meer betekenisvols dat mensen zouden begrijpen."

De RAISERROR-functie is een SQL-serversysteemopdracht die een foutmelding kan veroorzaken. U kunt het gebruiken om fouten, waarschuwingen of informatieve berichten aan te geven.

Fouten kunnen worden veroorzaakt door de programmeur of door SQL Server zelf. Het is handig om feedback te geven wanneer er iets misgaat, maar ook wanneer er iets moet gebeuren zonder de uitvoering van andere instructies in de batch te onderbreken.

Gebruik de volgende syntaxis:

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

U kunt RAISERROR ook toepassen om de uitvoering van een instructie te beëindigen of om door SQL-instructies gegenereerde fouten door te geven aan een andere toepassing. U kunt bijvoorbeeld een foutmelding geven waardoor de uitvoering van de huidige batch of instructie stopt, en het opgegeven bericht weergeven.

Het meest gebruikelijke gebruik van RAISERROR is het genereren van een foutmelding wanneer gegevens niet aan bepaalde criteria voldoen, zoals het invoeren van te veel tekens in een veld dat slechts 50 tekens toestaat.

Raiserror(msg) is handig voor het afhandelen van fouten die optreden tijdens de verwerking, en het vereist niet dat de hele transactie mislukt vanwege één individuele fout.

Nu kunt u zoveel eigen fouten maken als u wilt. Verheug je!

Omgaan met fouten

Om met fouten om te gaan, moeten we ze kunnen beheersen en alle gerelateerde informatie kunnen achterhalen. Het is in ieder geval noodzakelijk dat het ingewikkelder is dan het typen van PRINT in "Hello World".

Een handige manier om fouten op te sporen is het gebruik van TRY…CATCH. Met deze tool kunt u uw code meenemen en in een omgeving plaatsen waar deze veilig kan worden bekeken en gehanteerd. Daar kunt u de gegevens eruit halen. Beslis of je de fout wilt melden, er meer over wilt weten of de fout wilt oplossen.

Deze SQL-server-sandbox gaat als volgt:

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

De code die u wilt bekijken, wordt tussen BEGIN TRY en END TRY geplaatst. Als er fouten optreden, wordt het naar het CATCH-statement gestuurd. Dit biedt ons veel nuttige functionaliteit:

  • ERROR_NUMBER geeft het interne nummer van de fout terug
  • ERROR_STATE geeft de informatie over de bron terug
  • ERROR_SEVERITY retourneert de informatie over alles, van informatieve fouten tot fouten die gebruikers van DBA kunnen oplossen, enz.
  • ERROR_LINE retourneert het regelnummer waarop een fout is opgetreden op
  • ERROR_PROCEDURE geeft de naam van de opgeslagen procedure of functie terug
  • ERROR_MESSAGE retourneert de meest essentiële informatie en dat is de berichttekst van de fout.

Dit is wat we krijgen als we proberen 1 door 0 te delen:

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

Zoals je kunt zien, is de TRY…CATCH-functie erg handig.

Samenvatting

Nu weet u precies wat SQL-foutcode is, welke soorten fouten er zijn, waarom ze gebeuren, hoe ze in een sandbox worden geplaatst en bestudeerd, hoe u uw foutsignalen kunt creëren, enz. U bent veel meer dan alleen voorbereid om met fouten om te gaan! Als dat niet het geval is, laat het ons dan weten, dan zullen we in de toekomst meer handleidingen publiceren. Veel succes!


  1. Een lokale SQL Server-database instellen

  2. Postgresql GROUP_CONCAT equivalent?

  3. Fout bij het bulksgewijs laden van gegevensconversie (type komt niet overeen of ongeldig teken voor de opgegeven codetabel) voor rij 1, kolom 4 (jaar)

  4. Ik begrijp Collatie niet? (Mysql, RDBMS, Tekensets)