Database
 sql >> Base de données >  >> RDS >> Database

Comment lire et interpréter les erreurs SQL

Les codes d'erreur dans SQL sont générés par le serveur pour fournir des informations sur ce qui s'est mal passé. Ils ont des significations différentes selon la version SQL que vous utilisez, mais ils indiquent généralement l'incapacité d'effectuer une opération demandée.

La façon la plus simple de l'explorer est le langage de programmation le plus simple appelé BASIC et ses programmes comme "Hello world". Tapez ce qui suit dans l'interface :

PRINT "Hello, World!"

Si vous tapez PRINT comme PRRRR, vous obtiendrez un message d'erreur (un équivalent dans la vraie vie serait quelqu'un vous disant de conduire sur le côté droit de la route, par exemple en respectant les règles).

C'est relativement facile lorsqu'il s'agit d'opérations simples, mais qu'en est-il des systèmes plus complexes ? Nous incluons également des exemples de code SQL ici. Amusez-vous !

Le code suivant importe les fonctions nécessaires à partir de la bibliothèque standard, puis crée une console, obtient un pointeur vers son flux de sortie standard, imprime le message dans ce flux et libère les objets en cours d'utilisation :

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

Si vous faites une erreur dans ce code, il faut un certain temps pour le trouver, surtout si vous avez 500 pages de code comme celui-ci. Ainsi, l'ordinateur trouvera les erreurs et vous indiquera où elles se trouvent.

À quoi servent les codes d'erreur SQL et comment fonctionnent-ils ?

L'utilité des codes d'erreur SQL est que le logiciel trouve votre code et pointe dessus (exemple). Vous n'avez pas à vérifier manuellement des milliers de lignes de code vous-même. Imaginez que vous n'obteniez qu'un seul code d'erreur ("Plus de chance la prochaine fois, perdant !" ou "Qui t'a appris à coder, un cheval ?") et que vous deviez recommencer tout le projet !

En un sens, les codes d'erreur sont d'excellents petits assistants du Père Noël :clairs, utiles et qui font gagner beaucoup de temps. Il vous suffit d'apprendre à les connaître.

Au niveau de base, les bases de données sont des collections d'informations rassemblées et classées. Le type qui nous intéresse est celui des bases de données relationnelles, ce qui signifie qu'il existe des relations entre les cellules dans lesquelles les données sont stockées.

Par exemple, vous pouvez avoir tout un groupe d'étudiants dans une université et vouloir récompenser tous ceux qui ont obtenu plus de 90 % à leurs examens avec un prix. Vous pouvez écrire manuellement leurs noms, sexes, adresses, numéros de compte bancaire (ils sont tous liés, donc des bases de données relationnelles), leurs notes, puis choisir manuellement ceux qui obtiennent des scores élevés.

Archaïque? Oui, mais vous seriez surpris d'apprendre combien d'entreprises font encore des affaires de cette façon au 21e siècle. Cela pourrait prendre des mois pour effectuer des opérations qui prendraient quelques secondes à un ordinateur. Surtout si nous parlons de centaines ou de milliers d'étudiants.

Maintenant, en mettant tous ces étudiants dans une base de données, vous pourriez utiliser un langage comme SQL :

SELECT * FROM Student WHERE Percentage>=90;

Fait! Les problèmes, cependant, commencent lorsque vous écrivez votre code.

Naturellement, cela devient très complexe, donc plus vous écrivez, plus il y a de chances que votre code contienne des erreurs. Ici, les codes d'erreur seront les plus utiles. Lorsque nous voyons des codes d'erreur, nous devrions être reconnaissants (ce qui ne nous empêche pas de les jurer à chaque fois). Ils font tout le travail pour vous, et tout ce que vous avez à faire est d'aller à la source et de résoudre le problème.

Donnez-moi quelques détails !

Lorsqu'une base de données ne parvient pas à produire les résultats souhaités, un code d'erreur est généré. Il aide à identifier le problème et comment le résoudre. Les codes d'erreur SQL, comme ceux ci-dessous, seront utiles lors du dépannage de tout problème avec vos bases de données :

Messages d'erreur de la base de données Oracle9i

Version 2 (9.2)

ORA-00904 :"le nombre de lignes spécifié dépasse le maximum".

ORA-00900 :"privilèges insuffisants sur l'objet".

ORA-00900 :"instruction SQL non valide".

ORA-00902 :"type de données non valide".

Nous avons de nombreux types d'erreurs différents dans SQL. Mais si vous n'allez pas les encadrer et les mettre sur votre mur, vous devez savoir comment les gérer. La bonne chose est que les erreurs SQL sont accompagnées d'un lien vers l'emplacement précis de l'erreur dans un code et fournissent également des informations sur ce qui ne va pas.

Commençons par l'exemple d'erreur le plus simple :

ORA-00900 :"instruction SQL non valide".

Comme vous l'avez probablement deviné, vous devez écrire la commande correctement. Il pourrait y avoir une faute de frappe ou une virgule à un endroit auquel elle n'appartient pas. Ou, selon le cas, vous devrez peut-être installer un logiciel supplémentaire :

"L'instruction n'est pas reconnue comme une instruction SQL valide.

Cette erreur peut se produire si l'option procédurale n'est pas installée et qu'une instruction SQL est émise qui nécessite cette option (par exemple, une instruction CREATE PROCEDURE). Vous pouvez déterminer si l'option procédurale est installée en démarrant SQL*Plus. Si la bannière PL/SQL n'est pas affichée, alors l'option n'est pas installée.

Action :Corrigez la syntaxe ou installez l'option procédurale".

Il en va de même pour le type de formatage ou le placement de mauvais types de données là où ils n'appartiennent pas :

ORA-00902 type de données invalide

"Cause :Le type de données saisi dans l'instruction CREATE ou ALTER TABLE n'est pas valide.

Action :Corrigez la syntaxe".

Vous pouvez trouver plus d'informations dans la documentation Oracle.

Les codes d'erreur SQL sont le moyen le plus courant de déboguer les requêtes SQL. Chaque fois que vous interrogez la base de données et que le problème se produit, le moteur de base de données génère le code d'erreur SQL. Ces codes représentent l'emplacement du problème dans la requête et donnent aux programmeurs des informations sur la façon de le résoudre ou sur la façon d'en interpréter la cause.

Principaux types d'erreurs

Erreurs de format

Par exemple, lorsque vous utilisez SELECT, vous devez le suivre d'une certaine séquence (énumérez les colonnes du tableau, qui contient nos étudiants et leurs notes), puis une étoile. Si vous ne suivez pas le format, échangez une étoile et une virgule, vous obtiendrez un message d'erreur.

"s'il y a une transaction BEGIN, elle doit toujours se terminer par une transaction COMMIT ou ROLLBACK."

Autre exemple :après FROM, vous utilisez des opérateurs comme WHERE qui nécessitent une condition. Il peut s'agir de n'importe quelle condition, y compris des conditions qui extraient des données, par exemple, tous les élèves dont les notes sont inférieures à 30. Si vous laissez ce champ vide, vous obtiendrez une erreur de format.

Erreur de l'opérateur

Les commandes doivent être compatibles avec SQL. Vous pouvez inclure SUM et COUNT avec WHERE. Sinon, vous obtenez une erreur.

Erreurs de procédure

Le code procédural est le code stocké sur le serveur que vous pouvez utiliser à vos fins avec des modifications mineures.

"Une procédure stockée est un code SQL préparé que vous pouvez enregistrer, de sorte que le code peut être réutilisé encore et encore... Donc, si vous avez une requête SQL que vous écrivez encore et encore, enregistrez-la en tant que procédure stockée, puis appelez-le simplement pour l'exécuter. ( Écoles W3 )

Pour créer une procédure stockée à partir d'une table appelée Clients avec tous ses enregistrements et l'exécuter, nous avons le code suivant :

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

En d'autres termes, les procédures sont comme des modèles stockés sur un serveur que vous pouvez prendre, modifier et utiliser selon vos besoins.

Les erreurs de procédure sont des types d'erreurs plus ou moins courants. La différence est qu'ils ne font pas référence à une seule ligne de code mais à l'ensemble de la procédure (modèle) que vous avez pris et essayé de modifier légèrement.

Imaginez que vous avez deux tables, une vide et une pleine. Vous appliquez le code ci-dessous à la table vide :

INSERT to transfer data
SELECT and WHERE to choose data

Un exemple d'erreur stratégique serait d'utiliser des opérateurs comme les opérateurs IN et NOT IN. C'est tentant mais pas très bien optimisé (utiliser JOIN est un bien meilleur choix stratégique).

Erreurs fatales et non fatales

Une base de données comme MySQL ou PostgreSQL stocke les données dans des tables composées de lignes et de colonnes. Les requêtes de base de données sont des commandes SQL qui indiquent à la base de données quoi faire avec ses données. Ils peuvent être aussi simples que de sélectionner tous les enregistrements d'une table, ou suffisamment complexes pour créer une toute nouvelle table.

Deux types d'erreurs peuvent survenir lors de l'utilisation de ces commandes :fatales et non fatales.

Une erreur fatale arrête l'exécution d'une instruction, contrairement à une erreur non fatale.

Une erreur fatale est une erreur de base de données qui ne peut pas être corrigée. Une erreur non fatale est un problème qui peut être résolu d'une manière ou d'une autre, par exemple en redémarrant le service SQL Server ou l'instance de SQL Server.

Une base de données peut avoir à la fois des erreurs fatales et non fatales à un moment donné pour de nombreuses raisons. Parfois, si vous êtes conscient du problème, il est possible de le résoudre sans trop de difficulté. D'autres fois, pas tellement.

Le type d'erreur le plus courant est un problème de syntaxe ou un autre problème d'exécution avec le système de base de données qui accède aux données de la table SQL. Ces erreurs peuvent être détectées lors des tests avant l'exécution du code. Vous pouvez vous assurer que tout fonctionne correctement lorsqu'il est exécuté sur le système de base de données.

Création de vos codes d'erreur avec RAISERROR

"Il existe une fonction RAISERROR qui peut être utilisée pour générer nos messages d'erreur personnalisés, ce qui est un excellent moyen de traduire des messages d'erreur confus en quelque chose d'un peu plus significatif que les gens comprendraient."

La fonction RAISERROR est une commande système du serveur SQL qui peut générer un message d'erreur. Vous pouvez l'utiliser pour indiquer des erreurs, des avertissements ou des messages d'information.

Les erreurs peuvent être causées par le programmeur ou par SQL Server lui-même. Il est utile pour fournir des commentaires en cas de problème, mais également lorsque quelque chose doit se produire sans interrompre l'exécution d'autres instructions du lot.

Utilisez la syntaxe suivante :

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

Vous pouvez également appliquer RAISERROR pour mettre fin à l'exécution d'une instruction ou pour transmettre les erreurs générées par les instructions SQL à une autre application. Par exemple, vous pouvez générer un message d'erreur qui entraînera l'arrêt de l'exécution du lot ou de l'instruction en cours, ainsi qu'afficher le message spécifié.

L'utilisation la plus courante de RAISERROR consiste à générer un message d'erreur lorsque les données ne répondent pas à certains critères, comme la saisie de trop de caractères dans un champ qui n'autorise que 50 caractères.

Raiserror(msg) est utile pour gérer les erreurs qui se produisent pendant le traitement, et il n'exige pas que la transaction entière échoue à cause d'une erreur individuelle.

Vous pouvez maintenant créer autant d'erreurs que vous le souhaitez. Réjouissez-vous !

Traitement des erreurs

Pour faire face aux erreurs, nous devons être en mesure de les contrôler et de connaître toutes les informations associées. Il est nécessaire dans tous les cas plus compliqués que la saisie erronée de PRINT dans "Hello World".

Un moyen utile de détecter les erreurs consiste à utiliser TRY…CATCH. Cet outil vous permet de prendre votre code et de le placer dans un environnement où il peut être examiné et manipulé en toute sécurité. Là, vous pouvez en extraire les données. Décidez si vous souhaitez signaler l'erreur, en savoir plus ou la corriger.

Ce bac à sable du serveur SQL se présente comme suit :

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

Le code que vous souhaitez regarder est placé entre BEGIN TRY et END TRY. Si des erreurs se produisent, elles sont envoyées à l'instruction CATCH. Cela nous offre de nombreuses fonctionnalités utiles :

  • ERROR_NUMBER renvoie le numéro interne de l'erreur
  • ERROR_STATE renvoie les informations sur la source
  • ERROR_SEVERITY renvoie les informations sur tout, des erreurs d'information aux erreurs que les utilisateurs de DBA peuvent corriger, etc.
  • ERROR_LINE renvoie le numéro de la ligne sur laquelle une erreur s'est produite
  • ERROR_PROCEDURE renvoie le nom de la procédure stockée ou de la fonction
  • ERROR_MESSAGE renvoie les informations les plus essentielles et c'est le texte du message de l'erreur.

Voici ce que nous obtenons lorsque nous essayons de diviser 1 par 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

Comme vous pouvez le constater, la fonction TRY…CATCH est très utile.

Résumé

Maintenant, vous savez exactement ce qu'est le code d'erreur SQL, quels types d'erreurs il y a, pourquoi elles se produisent, comment elles sont mises en bac à sable et étudiées, comment créer vos signaux d'erreur, etc. Vous êtes bien plus que simplement préparé à faire face aux erreurs ! Si ce n'est pas le cas, faites-le nous savoir et nous publierons d'autres guides à l'avenir. Bonne chance !