Database
 sql >> база данни >  >> RDS >> Database

Как да четем и тълкуваме SQL грешки

Кодовете за грешки в SQL се генерират от сървъра, за да предоставят информация за това какво се е объркало. Те имат различни значения в зависимост от версията на SQL, която използвате, но обикновено показват невъзможността за извършване на заявена операция.

Най-лесният начин да го изследвате е най-простият език за програмиране, наречен BASIC, и неговите програми като „Hello world“. Въведете следното в интерфейса:

PRINT "Hello, World!"

Ако въведете PRINT като PRRRR, ще получите съобщение за грешка (еквивалент в реалния живот би бил някой да ви каже да шофирате от дясната страна на пътя, например да спазвате правилата).

Това е сравнително лесно, когато става въпрос за прости операции, но какво да кажем за по-сложни системи? Тук също така включваме примери за SQL код. Насладете се!

Следният код импортира необходимите функции от стандартната библиотека, след това създава конзола, получава указател към стандартния си изходен поток и отпечатва съобщението в този поток и освобождава използваните обекти:

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

Ако направите грешка в този код, ще отнеме известно време, за да го намерите, особено ако имате 500 страници код като този. И така, компютърът ще намери грешки и ще ви насочи къде са.

За какво са SQL кодовете за грешки и как работят?

Полезността на SQL кодовете за грешки е, че софтуерът намира вашия код и сочи към него (пример). Не е нужно сами да проверявате хиляди кодови редове. Представете си, че получавате само един код за грешка („По-добър късмет следващия път, неудачник!“ или „Кой те научи как да кодираш, кон?“) и трябва да прегледаш целия проект отново!

В известен смисъл кодовете за грешки са отлични малки помощници на Дядо Коледа:ясни, полезни и спестяват много време. Просто трябва да ги опознаете.

Започвайки от основно ниво, базите данни са колекции от информация, събрана и класифицирана. Типът, който ни интересува, са релационни бази данни, което означава, че има връзки между клетките, в които се съхраняват данните.

Например, може да имате цяла група студенти в университет и да искате да наградите всеки, който е получил повече от 90% на изпитите си, с награда. Можете ръчно да напишете техните имена, пол, адреси, номера на банкови сметки (всички те са свързани, следователно релационни бази данни), оценки и след това ръчно да изберете тези с високи резултати.

Архаичен? Да, но ще се изненадате да научите колко компании все още правят бизнес по този начин през 21-ви век. Може да отнеме месеци за завършване на операции, които на компютъра биха отнели секунди. Особено ако говорим за стотици или хиляди студенти.

Сега, поставяйки всички тези ученици в база данни, можете да използвате език като SQL:

SELECT * FROM Student WHERE Percentage>=90;

Свършен! Проблемите обаче започват, когато напишете своя код.

Разбираемо става много сложно, така че колкото повече пишете, толкова по-големи са шансовете кодът ви да съдържа грешки. Тук кодовете за грешки ще бъдат най-полезни. Когато видим кодове за грешки, трябва да сме благодарни (което не ни пречи да ги ругаем всеки път). Те вършат цялата работа вместо вас и всичко, което трябва да направите, е да отидете до източника и да отстраните проблема.

Дайте ми някои подробности!

Когато база данни не успее да даде желаните резултати, се хвърля код за грешка. Помага да идентифицирате проблема и как да го отстраните. SQL кодовете за грешки, като тези по-долу, ще бъдат полезни при отстраняване на проблеми с вашите бази данни:

Съобщения за грешка в базата данни Oracle9i

Издание 2 (9.2)

ORA-00904:„посоченият брой редове надвишава максималния“.

ORA-00900:„недостатъчни привилегии на обекта“.

ORA-00900:„невалиден SQL израз“.

ORA-00902:„невалиден тип данни“.

Имаме много различни видове грешки в SQL. Но ако няма да ги поставите в рамка и да ги поставите на стената си, трябва да знаете как да се справите с тях. Хубавото е, че SQL грешките идват с връзка към точното местоположение на грешката в код и също така предоставят информация за това какво не е наред.

Нека започнем с най-простия пример за грешка:

ORA-00900:„невалиден SQL израз“.

Както вероятно сте се досетили, трябва да напишете командата правилно. Може да има печатна грешка или запетая някъде, където не е мястото. Или, в зависимост от случая, може да се наложи да инсталирате допълнителен софтуер:

„Изразът не е разпознат като валиден SQL израз.

Тази грешка може да възникне, ако Процедурната опция не е инсталирана и е издаден SQL израз, който изисква тази опция (например оператор CREATE PROCEDURE). Можете да определите дали Процедурната опция е инсталирана, като стартирате SQL*Plus. Ако PL/SQL банерът не се показва, тогава опцията не е инсталирана.

Действие:Коригирайте синтаксиса или инсталирайте процедурата.

Същото важи и за типа форматиране или поставянето на грешни типове данни там, където не им е мястото:

ORA-00902 невалиден тип данни

„Причина:Типът данни, въведен в израза CREATE или ALTER TABLE, не е валиден.

Действие:Коригирайте синтаксиса”.

Можете да намерите повече информация в документацията на Oracle.

SQL кодовете за грешки са най-често срещаният начин за отстраняване на грешки в SQL заявки. Всеки път, когато направите заявка към базата данни и проблемът се случи, машината на базата данни генерира кода за грешка на SQL. Тези кодове представляват местоположението на проблема в заявката и дават на програмистите информация как да го поправят или как да тълкуват какво го е причинило.

Основни типове грешки

Грешки при форматиране

Например, когато използвате SELECT, трябва да го следвате с определена последователност (избройте колоните в таблицата, която съдържа нашите ученици и техните оценки), след това със звезда. Ако не спазвате формата, разменете звезда и запетая, ще получите съобщение за грешка.

„ако има ТРАНЗАКЦИЯ НАЧАЛО, тя винаги трябва да завършва с транзакция COMMIT или ROLLBACK.“

Друг пример:след FROM използвате оператори като WHERE което изисква условие. Това може да бъде всяко условие, включително условия, които извличат данни, например всички ученици с оценки под 30. Ако оставите това поле празно, ще получите грешка при форматирането.

Грешка на оператора

Командите трябва да са съвместими със SQL. Не можете да включите SUM и COUNT с WHERE. В противен случай получавате грешка.

Процедурни грешки

Процедурният код е кодът, съхранен на сървъра, който можете да използвате за вашите цели с незначителни промени.

„Запазената процедура е подготвен SQL код, който можете да запазите, така че кодът да може да се използва отново и отново... Така че, ако имате SQL заявка, която пишете отново и отново, запазете я като съхранена процедура, и след това просто го извикайте, за да го изпълните." ( W3 училища )

За да създадете съхранена процедура от таблица, наречена Клиенти с всичките му записи и го изпълним, имаме следния код:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

С други думи, процедурите са като шаблони, съхранявани на сървър, които можете да вземете, промените и използвате, ако е необходимо.

Процедурните грешки са повече или по-малко обичайни видове грешки. Разликата е, че те не се отнасят до един ред код, а до цялата процедура (шаблон), която сте взели и се опитахте да промените леко.

Представете си, че имате две маси, една празна и една пълна. Прилагате кода по-долу към празната таблица:

INSERT to transfer data
SELECT and WHERE to choose data

Пример за стратегическа грешка би било използването на оператори като IN и NOT IN оператори. Изкушаващо е, но не е много добре оптимизирано (използването на JOIN е много по-добър стратегически избор).

Фатални и нефатални грешки

База данни като MySQL или PostgreSQL съхранява данни в таблици, които са съставени от редове и колони. Заявките към базата данни са SQL команди, които казват на базата данни какво да прави с нейните данни. Те могат да бъдат толкова прости, колкото избирането на всички записи от таблица, или достатъчно сложни, за да създадат изцяло нова таблица.

Има два типа грешки, които могат да възникнат при използване на тези команди:фатални и нефатални.

Фатална грешка спира изпълнението на оператор, докато нефатална грешка не.

Фатална грешка е грешка в базата данни, която не може да бъде коригирана. Нефатална грешка е проблем, който може да бъде разрешен по някакъв начин, например чрез рестартиране на услугата SQL Server или екземпляра на SQL Server.

Една база данни може да има както фатални, така и нефатални грешки във всеки един момент по много причини. Понякога, ако сте наясно с проблема, е възможно да го разрешите без особени затруднения. Друг път не толкова.

Най-често срещаният тип грешка е синтаксис или друг проблем по време на изпълнение със системата на базата данни, която осъществява достъп до данни от SQL таблицата. Тези грешки могат да бъдат уловени при тестване преди стартиране на кода. Можете да гарантирате, че всичко работи правилно, когато се изпълнява срещу системата на базата данни.

Създаване на вашите кодове за грешки с RAISERROR

„Има функция RAISERROR, която може да се използва за генериране на нашите персонализирани съобщения за грешки, което е чудесен начин да преведете объркващите съобщения за грешка в нещо малко по-смислено, което хората биха разбрали.“

Функцията RAISERROR е системна команда на SQL сървър, която може да изведе съобщение за грешка. Можете да го използвате, за да посочите грешки, предупреждения или информационни съобщения.

Грешките могат да бъдат причинени от програмиста или от самия SQL Server. Полезно е за предоставяне на обратна връзка, когато нещо се обърка, но също и когато нещо трябва да се случи, без да се прекъсва изпълнението на други оператори в пакета.

Използвайте следния синтаксис:

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

Можете също да приложите RAISERROR, за да прекратите изпълнението на оператор или да предадете грешки, генерирани от SQL изрази, към друго приложение. Например, можете да изведете съобщение за грешка, което ще доведе до спиране на изпълнението на текущата партида или оператор, както и да покажете посоченото съобщение.

Най-честата употреба на RAISERROR е да генерира съобщение за грешка, когато данните не отговарят на някои критерии, като например въвеждане на твърде много знаци в поле, което позволява само 50 знака.

Raiserror(msg) е полезен за обработка на грешки, които възникват по време на обработката, и не изисква цялата транзакция да се провали поради една отделна грешка.

Сега можете да създавате толкова собствени грешки, колкото искате. Радвайте се!

Справяне с грешки

За да се справим с грешките, трябва да можем да ги контролираме и да открием цялата свързана информация. Необходимо е за всеки случай, който е по-сложен от погрешното въвеждане на PRINT в „Hello World“.

Един полезен начин за улавяне на грешки е използването на TRY…CATCH. Този инструмент ви позволява да вземете вашия код и да го поставите в среда, където може да бъде разгледан и боравен безопасно. Там можете да извлечете данните от него. Решете дали искате да съобщите за грешката, да научите повече за нея или да я поправите.

Тази пясъчна среда на SQL сървър изглежда така:

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

Кодът, който искате да гледате, се поставя между BEGIN TRY и END TRY. Ако се случат грешки, той се изпраща до оператора CATCH. Това ни предоставя много полезни функции:

  • ERROR_NUMBER връща вътрешния номер на грешката
  • ERROR_STATE връща информацията за източника
  • ERROR_SEVERITY връща информация за всичко - от информационни грешки до грешки, които потребителите на DBA могат да поправят и т.н.
  • ERROR_LINE връща номера на реда, на който е възникнала грешка
  • ERROR_PROCEDURE връща името на съхранената процедура или функция
  • ERROR_MESSAGE връща най-важната информация и това е текстът на съобщението за грешката.

Ето какво получаваме, когато се опитаме да разделим 1 на 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

Както можете да видите, функцията TRY...CATCH е много полезна.

Резюме

Сега знаете точно какъв е кодът за грешка в SQL, какви типове грешки има, защо се случват, как са затворени и проучени, как да създавате сигналите си за грешка и т.н. Вие сте много повече от просто подготвени да се справите с грешките! Ако не, уведомете ни и ние ще пуснем още ръководства в бъдеще. Успех!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничения на оптимизатора с филтрирани индекси

  2. Преодоляване на пропастта в Azure:управлявани екземпляри

  3. Извършване на одит на промените в данните с помощта на временна таблица

  4. Сравняване на методите за разделяне/конкатенация на низове

  5. Какво общо имат Олимпийските игри, футболните мачове от УЕФА Евро 2016 и базите данни?