sql >> Databáze >  >> RDS >> Database

Jak číst a interpretovat chyby SQL

Chybové kódy v SQL jsou generovány serverem, aby poskytovaly informace o tom, co se pokazilo. Mají různý význam v závislosti na verzi SQL, kterou používáte, ale obvykle indikují nemožnost provést požadovanou operaci.

Nejjednodušší způsob, jak jej prozkoumat, je nejjednodušší programovací jazyk zvaný BASIC a jeho programy jako „Ahoj světe“. Do rozhraní zadejte následující:

PRINT "Hello, World!"

Pokud zadáte PRINT jako PRRRR, zobrazí se chybová zpráva (ekvivalentem v reálném životě by bylo, že vám někdo řekne, abyste jeli po pravé straně silnice, např. abyste dodržovali pravidla).

To je relativně snadné, pokud jde o jednoduché operace, ale co složitější systémy? Zde také uvádíme příklady kódu SQL. Užijte si to!

Následující kód importuje potřebné funkce ze standardní knihovny, poté vytvoří konzolu, získá ukazatel na svůj standardní výstupní proud a vytiskne zprávu do tohoto proudu a uvolní používané objekty:

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

Pokud v tomto kódu uděláte chybu, chvíli trvá, než ji najdete, zvláště pokud máte 500 stránek kódu, jako je tento. Počítač tedy najde chyby a nasměruje vás tam, kde se nacházejí.

K čemu jsou kódy chyb SQL a jak fungují?

Užitečnost chybových kódů SQL spočívá v tom, že software najde váš kód a ukáže na něj (příklad). Nemusíte sami ručně kontrolovat tisíce řádků kódu. Představte si, že byste dostali jen jeden chybový kód („Příště více štěstí, ztroskotanci!“ nebo „Kdo tě naučil kódovat, kůň?“) a museli byste celý projekt procházet znovu!

V jistém smyslu jsou chybové kódy vynikajícími Santovými malými pomocníky:jsou jasné, užitečné a šetří spoustu času. Jen je musíte poznat.

Počínaje základní úrovní jsou databáze sbírkou informací sestavených a klasifikovaných. Typ, který nás zajímá, jsou relační databáze, což znamená, že existují vztahy mezi buňkami, ve kterých jsou data uložena.

Můžete mít například celou skupinu studentů na univerzitě a chcete odměnit každého, kdo u zkoušek dosáhl více než 90 %, odměnou. Můžete ručně napsat jejich jména, pohlaví, adresy, čísla bankovních účtů (to vše spolu souvisí, tedy relační databáze), známky a poté ručně vybrat ty s vysokým skóre.

Archaický? Ano, ale překvapilo by vás, kolik společností tímto způsobem stále podniká v 21. století. Dokončení operací, které by počítači zabralo několik sekund, může trvat měsíce. Zvláště pokud mluvíme o stovkách nebo tisících studentů.

Nyní, když vložíte všechny tyto studenty do databáze, můžete použít jazyk jako SQL:

SELECT * FROM Student WHERE Percentage>=90;

Hotovo! Problémy však začínají při psaní kódu.

Pochopitelně je to velmi složité, takže čím více píšete, tím vyšší je pravděpodobnost, že váš kód obsahuje chyby. Zde budou nejužitečnější chybové kódy. Když vidíme chybové kódy, měli bychom být vděční (což nám nebrání v tom, abychom jim pokaždé nadávali). Udělají za vás veškerou práci a vše, co musíte udělat, je jít ke zdroji a problém vyřešit.

Dejte mi nějaké podrobnosti!

Když databáze neprodukuje požadované výsledky, je vyvolán chybový kód. Pomáhá identifikovat problém a jak jej opravit. Chybové kódy SQL, jako jsou ty níže, budou užitečné při řešení jakýchkoli problémů s databázemi:

Chybové zprávy databáze Oracle9i

Vydání 2 (9.2)

ORA-00904:„Zadaný počet řádků překračuje maximum“.

ORA-00900:„nedostatečná oprávnění k objektu“.

ORA-00900:„neplatný příkaz SQL“.

ORA-00902:„neplatný datový typ“.

V SQL máme mnoho různých typů chyb. Pokud je ale nehodláte zarámovat a pověsit na zeď, musíte vědět, jak s nimi zacházet. Dobrá věc je, že chyby SQL přicházejí s odkazem na přesné umístění chyby v kódu a také poskytují informace o tom, co je špatně.

Začněme nejjednodušším příkladem chyby:

ORA-00900:„neplatný příkaz SQL“.

Jak jste pravděpodobně uhodli, musíte příkaz správně napsat. Někde, kam nepatří, může být překlep nebo čárka. Případně může být nutné nainstalovat další software:

„Příkaz nebyl rozpoznán jako platný příkaz SQL.

K této chybě může dojít, pokud není nainstalována možnost Procedural a je zadán příkaz SQL, který tuto možnost vyžaduje (například příkaz CREATE PROCEDURE). Zda je nainstalována procedurální volba, můžete určit spuštěním SQL*Plus. Pokud se banner PL/SQL nezobrazuje, pak volba není nainstalována.

Akce:Opravte syntaxi nebo nainstalujte procedurální možnost.“

Totéž platí pro typ formátování nebo umístění nesprávných datových typů tam, kam nepatří:

ORA-00902 neplatný datový typ

Příčina:Datový typ zadaný v příkazu CREATE nebo ALTER TABLE není platný.

Akce:Opravte syntaxi.

Další informace naleznete v dokumentaci Oracle.

Kódy chyb SQL jsou nejběžnějším způsobem ladění dotazů SQL. Kdykoli zadáte dotaz do databáze a dojde k problému, databázový stroj vygeneruje kód chyby SQL. Tyto kódy představují umístění problému v dotazu a poskytují programátorům informace o tom, jak jej opravit nebo jak interpretovat, co jej způsobilo.

Hlavní typy chyb

Chyby formátu

Například, když používáte SELECT, musíte za ním následovat s určitou posloupností (vypsat sloupce v tabulce, která obsahuje naše studenty a jejich známky), a poté s hvězdičkou. Pokud nedodržíte formát, zaměníte hvězdičku a čárku, zobrazí se chybová zpráva.

„pokud existuje ZAČÁTEK TRANSAKCE, musí vždy končit transakcí COMMIT nebo ROLLBACK.“

Další příklad:po FROM použijete operátory jako WHERE, které vyžadují podmínku. Může to být jakákoli podmínka, včetně podmínek, které extrahují data, např. všichni studenti se známkami do 30 let. Pokud toto pole ponecháte prázdné, zobrazí se chyba formátu.

Chyba operátora

Příkazy musí být kompatibilní s SQL. Pomocí WHERE nemůžete zahrnout SUM a COUNT. V opačném případě se zobrazí chyba.

Procedurální chyby

Procedurální kód je kód uložený na serveru, který můžete s malými změnami použít pro své účely.

„Uložená procedura je připravený kód SQL, který můžete uložit, takže kód lze znovu a znovu použít… Pokud tedy máte dotaz SQL, který píšete znovu a znovu, uložte jej jako uloženou proceduru, a pak to prostě zavolej, abys to provedl.“ ( Školy W3 )

Chcete-li vytvořit uloženou proceduru z tabulky nazvané Zákazníci se všemi jeho záznamy a jeho provedením máme následující kód:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Jinými slovy, procedury jsou jako šablony uložené na serveru, které si můžete vzít, upravit a použít podle potřeby.

Procedurální chyby jsou víceméně obvyklé druhy chyb. Rozdíl je v tom, že se nevztahují na jeden řádek kódu, ale na celou proceduru (šablonu), kterou jste vzali a pokusili se mírně změnit.

Představte si, že máte dva stoly, jeden prázdný a jeden plný. Níže uvedený kód použijete na prázdnou tabulku:

INSERT to transfer data
SELECT and WHERE to choose data

Příkladem strategické chyby může být použití operátorů jako IN a NOT IN. Je to lákavé, ale ne příliš dobře optimalizované (použít JOIN je mnohem lepší strategická volba).

Závažné a nezávažné chyby

Databáze jako MySQL nebo PostgreSQL ukládá data do tabulek, které se skládají z řádků a sloupců. Databázové dotazy jsou SQL příkazy, které říkají databázi, co má dělat s jejími daty. Mohou být tak jednoduché, jako je výběr všech záznamů z tabulky, nebo dostatečně složité na vytvoření zcela nové tabulky.

Při použití těchto příkazů mohou nastat dva typy chyb:fatální a nezávažné.

Závažná chyba zastaví provádění příkazu, zatímco nezávažná chyba nikoli.

Závažná chyba je chyba databáze, kterou nelze opravit. Nezávažná chyba je problém, který lze nějakým způsobem vyřešit, například restartováním služby SQL Server nebo instance SQL Server.

Databáze může mít v kteroukoli chvíli z mnoha důvodů závažné i nezávažné chyby. Někdy, pokud o problému víte, je možné jej vyřešit bez větších potíží. Jindy moc ne.

Nejběžnějším typem chyby je syntaxe nebo jiný runtime problém s databázovým systémem, který přistupuje k datům z tabulky SQL. Tyto chyby lze zachytit při testování před spuštěním kódu. Můžete zajistit, aby vše fungovalo správně při spuštění proti databázovému systému.

Vytváření chybových kódů pomocí RAISERROR

„Existuje funkce RAISERROR, kterou lze použít ke generování našich vlastních chybových zpráv, což je skvělý způsob, jak převést matoucí chybové zprávy na něco trochu smysluplnějšího, čemu by lidé rozuměli.“

Funkce RAISERROR je systémový příkaz SQL serveru, který může vyvolat chybovou zprávu. Můžete jej použít k označení chyb, varování nebo informačních zpráv.

Chyby mohou být způsobeny programátorem nebo samotným SQL Serverem. Je to užitečné pro poskytování zpětné vazby, když se něco pokazí, ale také když se něco musí stát, aniž by došlo k přerušení provádění dalších příkazů v dávce.

Použijte následující syntaxi:

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

RAISERROR můžete také použít k ukončení provádění příkazu nebo k předání chyb generovaných příkazy SQL do jiné aplikace. Můžete například vyvolat chybovou zprávu, která způsobí zastavení provádění aktuální dávky nebo příkazu, a také zobrazit zadanou zprávu.

Nejběžnějším použitím RAISERROR je generování chybové zprávy, když data nesplňují některá kritéria, jako je zadání příliš mnoha znaků do pole, které povoluje pouze 50 znaků.

Raiserror(msg) je užitečné pro řešení chyb, ke kterým dochází během zpracování, a nevyžaduje, aby celá transakce selhala kvůli jedné jednotlivé chybě.

Nyní můžete vytvořit tolik vlastních chyb, kolik chcete. Radujte se!

Řešení chyb

Abychom se vypořádali s chybami, musíme je umět ovládat a zjistit všechny související informace. Je to nutné pro každý případ, který je složitější než chybné zadání TISK v „Hello World“.

Jedním z užitečných způsobů zachycení chyb je použití TRY…CATCH. Tento nástroj vám umožňuje vzít váš kód a umístit jej do prostředí, kde jej lze prozkoumat a bezpečně s ním zacházet. Tam z něj můžete extrahovat data. Rozhodněte se, zda chcete chybu nahlásit, zjistit o ní více nebo ji opravit.

Tento sandbox SQL serveru vypadá takto:

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

Kód, který chcete sledovat, je umístěn mezi BEGIN TRY a END TRY. Pokud dojde k chybě, odešle se do příkazu CATCH. To nám poskytuje mnoho užitečných funkcí:

  • ERROR_NUMBER vrátí interní číslo chyby
  • ERROR_STATE vrací informace o zdroji
  • ERROR_SEVERITY vrací informace o čemkoli, od informačních chyb po chyby, které mohou opravit uživatelé DBA atd.
  • ERROR_LINE vrací číslo řádku, na kterém došlo k chybě
  • ERROR_PROCEDURE vrací název uložené procedury nebo funkce
  • ERROR_MESSAGE vrací nejpodstatnější informace a to je text zprávy o chybě.

Zde je to, co dostaneme, když se pokusíme vydělit 1 nulou:

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

Jak můžete vidět, funkce TRY…CATCH je velmi užitečná.

Shrnutí

Nyní přesně víte, co je chybový kód SQL, jaké typy chyb existují, proč k nim dochází, jak jsou sandboxovány a studovány, jak vytvářet chybové signály atd. Jste mnohem víc než jen připraveni vypořádat se s chybami! Pokud ne, dejte nám vědět a my v budoucnu vydáme další průvodce. Hodně štěstí!


  1. Výkon ovladače MariaDB Java Connector Driver

  2. Jak zkontroluji, zda je sloupec prázdný nebo prázdný v MySQL?

  3. T-SQL Přeskočit Převzít uloženou proceduru

  4. Jak číst všechny řádky z velké tabulky?