sql >> Base de Datos >  >> RDS >> Database

Cómo leer e interpretar errores de SQL

El servidor genera códigos de error en SQL para proporcionar información sobre lo que salió mal. Tienen diferentes significados según la versión de SQL que esté utilizando, pero generalmente indican la imposibilidad de realizar una operación solicitada.

La forma más fácil de explorarlo es el lenguaje de programación más simple llamado BASIC y sus programas como "Hola mundo". Escriba lo siguiente en la interfaz:

PRINT "Hello, World!"

Si escribe IMPRIMIR como PRRRR, obtendrá un mensaje de error (un equivalente en la vida real sería que alguien le diga que conduzca por el lado derecho de la carretera, por ejemplo, obedeciendo las reglas).

Eso es relativamente fácil cuando se trata de operaciones simples, pero ¿qué pasa con los sistemas más complejos? También incluimos ejemplos de código SQL aquí. ¡Disfrútalo!

El siguiente código importa las funciones necesarias de la biblioteca estándar, luego crea una consola, obtiene un puntero a su flujo de salida estándar, imprime el mensaje en este flujo y libera los objetos en uso:

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 comete un error en este código, llevará un tiempo encontrarlo, especialmente si tiene 500 páginas de código como este. Entonces, la computadora encontrará errores y le indicará dónde están.

¿Para qué sirven los códigos de error SQL y cómo funcionan?

La utilidad de los códigos de error de SQL es que el software encuentra su código y lo señala (ejemplo). No tiene que verificar manualmente miles de líneas de código usted mismo. Imagínese recibir un solo código de error ("¡Mejor suerte la próxima vez, perdedor!" o "¿Quién te enseñó a programar, un caballo?") y tener que repasar todo el proyecto nuevamente.

En cierto sentido, los códigos de error son excelentes pequeños ayudantes de Papá Noel:claros, útiles y ahorran toneladas de tiempo. Solo tienes que llegar a conocerlos.

Comenzando en el nivel básico, las bases de datos son colecciones de información reunidas y clasificadas. El tipo que nos interesa son las bases de datos relacionales, lo que significa que existen relaciones entre las celdas en las que se almacenan los datos.

Por ejemplo, puede tener un grupo completo de estudiantes en una universidad y desea premiar a todos los que obtuvieron más del 90% en sus exámenes con un premio. Puede escribir manualmente sus nombres, géneros, direcciones, números de cuentas bancarias (todos estos están relacionados, por lo tanto, son bases de datos relacionales), calificaciones y luego elegir manualmente los que tienen puntajes altos.

¿Arcaico? Sí, pero le sorprendería saber cuántas empresas todavía hacen negocios de esta manera en el siglo XXI. Podría tomar meses completar operaciones que le tomarían segundos a una computadora. Especialmente si estamos hablando de cientos o miles de estudiantes.

Ahora, poniendo a todos estos estudiantes en una base de datos podrías usar un lenguaje como SQL:

SELECT * FROM Student WHERE Percentage>=90;

¡Hecho! Los problemas, sin embargo, comienzan cuando escribes tu código.

Es comprensible que se vuelva muy complejo, por lo que cuanto más escriba, mayores serán las posibilidades de que su código contenga errores. Aquí, los códigos de error serán más útiles. Cuando vemos códigos de error, debemos estar agradecidos (lo que no nos impide insultarlos cada vez). Ellos hacen todo el trabajo preliminar por usted, y todo lo que necesita hacer es ir a la fuente y solucionar el problema.

¡Dame algunos detalles!

Cuando una base de datos no produce los resultados deseados, se genera un código de error. Ayuda a identificar el problema y cómo solucionarlo. Los códigos de error de SQL, como los siguientes, serán útiles para solucionar cualquier problema con sus bases de datos:

Mensajes de error de la base de datos Oracle9i

Versión 2 (9.2)

ORA-00904:"el número especificado de filas excede el máximo".

ORA-00900:"privilegios insuficientes en el objeto".

ORA-00900:"Declaración SQL no válida".

ORA-00902:"tipo de datos no válido".

Tenemos muchos tipos diferentes de errores en SQL. Pero si no vas a enmarcarlos y ponerlos en tu pared, necesitas saber cómo lidiar con ellos. Lo bueno es que los errores de SQL vienen con un enlace a la ubicación precisa del error en un código y también brindan información sobre lo que está mal.

Comencemos con el ejemplo de error más simple:

ORA-00900:"Declaración SQL no válida".

Como probablemente haya adivinado, debe escribir el comando correctamente. Podría haber un error tipográfico o una coma en algún lugar al que no pertenece. O, según sea el caso, es posible que deba instalar software adicional:

“La declaración no se reconoce como una declaración SQL válida.

Este error puede ocurrir si la opción de procedimiento no está instalada y se emite una instrucción SQL que requiere esta opción (por ejemplo, una instrucción CREATE PROCEDURE). Puede determinar si la opción de procedimiento está instalada iniciando SQL*Plus. Si no se muestra el anuncio de PL/SQL, la opción no está instalada.

Acción:corregir la sintaxis o instalar la opción de procedimiento”.

Lo mismo ocurre con el tipo de formato o poner tipos de datos incorrectos donde no pertenecen:

ORA-00902 tipo de datos no válido

“Causa:el tipo de datos ingresado en la instrucción CREATE o ALTER TABLE no es válido.

Acción:corregir la sintaxis”.

Puede encontrar más información en la documentación de Oracle.

Los códigos de error SQL son la forma más común de depurar consultas SQL. Cada vez que consulta la base de datos y ocurre el problema, el motor de la base de datos genera el código de error SQL. Estos códigos representan la ubicación del problema en la consulta y brindan a los programadores información sobre cómo solucionarlo o cómo interpretar qué lo causó.

Principales tipos de errores

Errores de formato

Por ejemplo, cuando usa SELECCIONAR, debe seguirlo con una secuencia determinada (enumere las columnas en la tabla, que contiene a nuestros estudiantes y sus calificaciones), luego una estrella. Si no sigue el formato, cambie una estrella y una coma, obtendrá un mensaje de error.

"si hay una TRANSACCIÓN DE INICIO, siempre debe terminar con una transacción COMMIT o ROLLBACK".

Otro ejemplo:después de FROM usa operadores como WHERE que requiere una condición. Puede ser cualquier condición, incluidas las condiciones que extraen datos, por ejemplo, todos los estudiantes con calificaciones inferiores a 30. Si deja este campo en blanco, obtendrá un error de formato.

Error del operador

Los comandos deben ser compatibles con SQL. Puede incluir SUM y COUNT con WHERE. De lo contrario, obtendrá un error.

Errores de procedimiento

El código de procedimiento es el código almacenado en el servidor que puede usar para sus propósitos con cambios menores.

“Un procedimiento almacenado es un código SQL preparado que puede guardar, por lo que el código se puede reutilizar una y otra vez... Entonces, si tiene una consulta SQL que escribe una y otra vez, guárdela como un procedimiento almacenado, y luego simplemente llámalo para ejecutarlo”. ( Escuelas W3 )

Para crear un procedimiento almacenado a partir de una tabla llamada Clientes con todos sus registros y ejecutarlo, tenemos el siguiente código:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

En otras palabras, los procedimientos son como plantillas almacenadas en un servidor que puede tomar, modificar y usar según sea necesario.

Los errores de procedimiento son tipos de errores más o menos habituales. La diferencia es que no se refieren a una sola línea de código, sino a todo el procedimiento (plantilla) que tomó y trató de cambiar ligeramente.

Imagina que tienes dos mesas, una vacía y otra llena. Aplica el siguiente código a la tabla vacía:

INSERT to transfer data
SELECT and WHERE to choose data

Un ejemplo de un error estratégico sería usar operadores como IN y NOT IN. Es tentador pero no está muy bien optimizado (usar JOIN es una opción estratégica mucho mejor).

Errores fatales y no fatales

Una base de datos como MySQL o PostgreSQL almacena datos en tablas, que se componen de filas y columnas. Las consultas de base de datos son comandos SQL que le dicen a la base de datos qué hacer con sus datos. Pueden ser tan simples como seleccionar todos los registros de una tabla o lo suficientemente complejas como para crear una tabla completamente nueva.

Hay dos tipos de errores que pueden ocurrir al usar estos comandos:fatales y no fatales.

Un error fatal detiene la ejecución de una declaración, mientras que un error no fatal no lo hace.

Un error fatal es un error de la base de datos que no se puede corregir. Un error no fatal es un problema que se puede resolver de alguna manera, por ejemplo, reiniciando el servicio de SQL Server o la instancia de SQL Server.

Una base de datos puede tener errores fatales y no fatales en un momento dado por muchas razones. A veces, si conoce el problema, es posible resolverlo sin demasiada dificultad. Otras veces, no tanto.

El tipo de error más común es una sintaxis u otro problema de tiempo de ejecución con el sistema de base de datos que accede a los datos de la tabla SQL. Estos errores se pueden detectar en las pruebas antes de ejecutar el código. Puede asegurarse de que todo funcione correctamente cuando se ejecuta contra el sistema de base de datos.

Creando sus Códigos de Error con RAISERROR

“Hay una función RAISERROR que se puede usar para generar nuestros mensajes de error personalizados, que es una excelente manera de traducir mensajes de error confusos en algo un poco más significativo que la gente pueda entender”.

La función RAISERROR es un comando del sistema del servidor SQL que puede generar un mensaje de error. Puede usarlo para indicar errores, advertencias o mensajes informativos.

Los errores pueden ser causados ​​por el programador o por el mismo SQL Server. Es útil para brindar retroalimentación cuando algo sale mal, pero también cuando algo debe suceder sin interrumpir la ejecución de otras declaraciones en el lote.

Utilice la siguiente sintaxis:

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

También puede aplicar RAISERROR para finalizar la ejecución de una instrucción o para transmitir los errores generados por las instrucciones SQL a otra aplicación. Por ejemplo, puede generar un mensaje de error que hará que se detenga la ejecución del lote o declaración actual, así como mostrar el mensaje especificado.

El uso más común de RAISERROR es generar un mensaje de error cuando los datos no cumplen con algunos criterios, como ingresar demasiados caracteres en un campo que solo permite 50 caracteres.

Raiserror(msg) es útil para manejar los errores que ocurren durante el procesamiento y no requiere que toda la transacción falle debido a un error individual.

Ahora puede crear tantos errores propios como desee. ¡Alégrate!

Lidiar con los errores

Para hacer frente a los errores, debemos ser capaces de controlarlos y averiguar toda la información relacionada. Es necesario para cualquier caso que sea más complicado que escribir mal PRINT en “Hello World”.

Una forma útil de detectar errores es usar TRY…CATCH. Esta herramienta le permite tomar su código y colocarlo en un entorno donde pueda examinarse y manipularse de manera segura. Allí, puede extraer los datos de él. Decide si deseas informar el error, obtener más información al respecto o solucionarlo.

Este sandbox del servidor SQL funciona así:

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

El código que desea ver se coloca entre BEGIN TRY y END TRY. Si ocurren errores, se envía a la instrucción CATCH. Esto nos proporciona una gran cantidad de funciones útiles:

  • ERROR_NUMBER devuelve el número interno del error
  • ERROR_STATE devuelve la información sobre la fuente
  • ERROR_SEVERITY devuelve información sobre cualquier cosa, desde errores informativos hasta errores que los usuarios de DBA pueden corregir, etc.
  • ERROR_LINE devuelve el número de línea en el que ocurrió un error
  • ERROR_PROCEDURE devuelve el nombre del procedimiento o función almacenado
  • ERROR_MESSAGE devuelve la información más esencial y ese es el texto del mensaje del error.

Esto es lo que obtenemos cuando intentamos dividir 1 entre 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

Como puede ver, la función TRY…CATCH es muy útil.

Resumen

Ahora sabe exactamente qué es el código de error de SQL, qué tipos de errores hay, por qué ocurren, cómo se estudian y encierran en un espacio aislado, cómo crear sus señales de error, etc. ¡Está mucho más que preparado para lidiar con los errores! Si no es así, infórmenos y publicaremos más guías en el futuro. ¡Buena suerte!