Os códigos de erro no SQL são gerados pelo servidor para fornecer informações sobre o que deu errado. Eles têm significados diferentes dependendo da versão do SQL que você está usando, mas geralmente indicam a incapacidade de realizar uma operação solicitada.
A maneira mais fácil de explorá-lo é a linguagem de programação mais simples chamada BASIC e seus programas como “Hello world”. Digite o seguinte na interface:
PRINT "Hello, World!"
Se você digitar PRINT como PRRRR, receberá uma mensagem de erro (um equivalente na vida real seria alguém dizendo para você dirigir no lado direito da estrada, por exemplo, obedecendo às regras).
Isso é relativamente fácil quando se trata de operações simples, mas e os sistemas mais complexos? Também estamos incluindo exemplos de código SQL aqui. Aproveitar!
O código a seguir importa as funções necessárias da biblioteca padrão, cria um console, obtém um ponteiro para seu fluxo de saída padrão, imprime a mensagem nesse fluxo e libera os objetos em 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
Se você cometer um erro neste código, demora um pouco para encontrá-lo, especialmente se você tiver 500 páginas de código como este. Assim, o computador encontrará erros e indicará onde eles estão.
Para que servem os códigos de erro SQL e como eles funcionam?
A utilidade dos códigos de erro SQL é que o software encontra seu código e aponta para ele (exemplo). Você não precisa verificar manualmente milhares de linhas de código. Imagine receber apenas um código de erro (“Boa sorte da próxima vez, perdedor!” ou “Quem te ensinou a codificar, um cavalo?”) e ter que revisar todo o projeto novamente!
De certa forma, os códigos de erro são excelentes ajudantes do Papai Noel:claros, úteis e economizam muito tempo. Você só precisa conhecê-los.
Começando no nível básico, os bancos de dados são coleções de informações reunidas e classificadas. O tipo em que estamos interessados são os bancos de dados relacionais, o que significa que existem relacionamentos entre as células nas quais os dados são armazenados.
Por exemplo, você pode ter um grupo inteiro de alunos em uma universidade e querer premiar todos que obtiveram mais de 90% em seus exames com um prêmio. Você pode escrever manualmente seus nomes, gêneros, endereços, números de contas bancárias (todos estão relacionados, portanto, bancos de dados relacionais), notas e, em seguida, escolher manualmente aqueles com pontuações mais altas.
Arcaico? Sim, mas você ficaria surpreso ao saber quantas empresas ainda fazem negócios dessa maneira no século 21. Pode levar meses para concluir operações que levariam segundos para um computador. Especialmente se estivermos falando de centenas ou milhares de alunos.
Agora, colocando todos esses alunos em um banco de dados, você pode usar uma linguagem como SQL:
SELECT * FROM Student WHERE Percentage>=90;
Feito! Os problemas, no entanto, começam quando você escreve seu código.
Compreensivelmente, fica muito complexo, então quanto mais você escreve, maiores são as chances de que seu código contenha erros. Aqui, os códigos de erro serão mais úteis. Quando vemos códigos de erro, devemos ser gratos (o que não nos impede de xingá-los todas as vezes). Eles fazem todo o trabalho braçal para você, e tudo que você precisa fazer é ir à fonte e corrigir o problema.
Dê-me alguns detalhes!
Quando um banco de dados não produz os resultados desejados, um código de erro é gerado. Ajuda a identificar o problema e como corrigi-lo. Códigos de erro SQL, como os abaixo, serão úteis ao solucionar problemas com seus bancos de dados:
Mensagens de erro do banco de dados Oracle9i
Versão 2 (9.2)
ORA-00904:"o número especificado de linhas excede o máximo".
ORA-00900:“privilégios insuficientes no objeto”.
ORA-00900:“instrução SQL inválida”.
ORA-00902:“tipo de dados inválido”.
Temos muitos tipos diferentes de erros no SQL. Mas se você não vai emoldurá-los e colocá-los na parede, precisa saber lidar com eles. O bom é que os erros de SQL vêm com um link para a localização precisa do erro em um código e também fornecem informações sobre o que está errado.
Vamos começar com o exemplo de erro mais simples:
ORA-00900:“instrução SQL inválida”.
Como você provavelmente adivinhou, você precisa escrever o comando corretamente. Pode haver um erro de digitação ou uma vírgula em algum lugar ao qual não pertence. Ou, conforme o caso, pode ser necessário instalar software adicional:
“A instrução não é reconhecida como uma instrução SQL válida.
Esse erro pode ocorrer se a Opção de procedimento não estiver instalada e uma instrução SQL for emitida exigindo essa opção (por exemplo, uma instrução CREATE PROCEDURE). Você pode determinar se a Opção de procedimento está instalada iniciando o SQL*Plus. Se o banner PL/SQL não for exibido, a opção não está instalada.
Ação:corrija a sintaxe ou instale a Opção de procedimento”.
O mesmo vale para o tipo de formatação ou colocar tipos de dados errados onde eles não pertencem:
Tipo de dados inválido ORA-00902
“Causa:o tipo de dados inserido na instrução CREATE ou ALTER TABLE não é válido.
Ação:corrija a sintaxe”.
Você pode encontrar mais informações na documentação da Oracle.
Os códigos de erro SQL são a maneira mais comum de depurar consultas SQL. Sempre que você consulta o banco de dados e o problema ocorre, o mecanismo de banco de dados gera o código de erro SQL. Esses códigos representam a localização do problema na consulta e fornecem aos programadores informações sobre como corrigi-lo ou como interpretar o que o causou.
Principais tipos de erros
Erros de formato
Por exemplo, quando você está usando SELECT, você precisa seguir com uma certa sequência (listar as colunas na tabela, que contém nossos alunos e suas notas), depois uma estrela. Se você não seguir o formato, troque uma estrela e uma vírgula, você receberá uma mensagem de erro.
“se houver uma transação BEGIN TRANSACTION, ela sempre deve terminar com uma transação COMMIT ou ROLLBACK.”
Outro exemplo:depois de FROM você usa operadores como WHERE que requer uma condição. Pode ser qualquer condição, incluindo condições que extraem dados, por exemplo, todos os alunos com notas abaixo de 30. Se você deixar este campo em branco, receberá um erro de formato.
Erro do operador
Os comandos precisam ser compatíveis com SQL. Você pode incluir SUM e COUNT com WHERE. Caso contrário, você receberá um erro.
Erros de procedimento
Código de procedimento é o código armazenado no servidor que você pode usar para seus propósitos com pequenas alterações.
"Um procedimento armazenado é um código SQL preparado que você pode salvar, para que o código possa ser reutilizado várias vezes... Portanto, se você tiver uma consulta SQL que você escreve várias vezes, salve-a como um procedimento armazenado, e depois é só chamá-lo para executá-lo.” ( Escolas W3 )
Para criar um procedimento armazenado de uma tabela chamada Clientes com todos os seus registros e executá-lo, temos o seguinte código:
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
EXEC SelectAllCustomers;
Em outras palavras, os procedimentos são como modelos armazenados em um servidor que você pode usar, alterar e usar conforme necessário.
Erros de procedimento são tipos mais ou menos usuais de erros. A diferença é que eles não se referem a uma única linha de código, mas a todo o procedimento (modelo) que você pegou e tentou mudar um pouco.
Imagine que você tem duas mesas, uma vazia e outra cheia. Você aplica o código abaixo à tabela vazia:
INSERT to transfer data
SELECT and WHERE to choose data
Um exemplo de erro estratégico seria usar operadores como os operadores IN e NOT IN. É tentador, mas não muito bem otimizado (usar JOIN é uma escolha estratégica muito melhor).
Erros fatais e não fatais
Um banco de dados como MySQL ou PostgreSQL armazena dados em tabelas, que são compostas de linhas e colunas. As consultas de banco de dados são comandos SQL que informam ao banco de dados o que fazer com seus dados. Eles podem ser tão simples quanto selecionar todos os registros de uma tabela ou complexos o suficiente para criar uma tabela totalmente nova.
Existem dois tipos de erros que podem ocorrer ao usar esses comandos:fatais e não fatais.
Um erro fatal interrompe a execução de uma instrução, enquanto um erro não fatal não.
Um erro fatal é um erro de banco de dados que não pode ser corrigido. Um erro não fatal é um problema que pode ser resolvido de alguma forma, por exemplo, reiniciando o serviço do SQL Server ou a instância do SQL Server.
Um banco de dados pode ter erros fatais e não fatais a qualquer momento por vários motivos. Às vezes, se você estiver ciente do problema, é possível resolvê-lo sem muita dificuldade. Outras vezes, nem tanto.
O tipo mais comum de erro é uma sintaxe ou outro problema de tempo de execução com o sistema de banco de dados que acessa dados da tabela SQL. Esses erros podem ser detectados no teste antes de executar o código. Você pode garantir que tudo funcione corretamente quando executado no sistema de banco de dados.
Criando seus códigos de erro com RAISERROR
"Existe uma função RAISERROR que pode ser usada para gerar nossas mensagens de erro personalizadas, que é uma ótima maneira de traduzir mensagens de erro confusas em algo um pouco mais significativo que as pessoas entendam."
A função RAISERROR é um comando do sistema SQL Server que pode gerar uma mensagem de erro. Você pode usá-lo para indicar erros, avisos ou mensagens informativas.
Os erros podem ser causados pelo programador ou pelo próprio SQL Server. É útil para fornecer feedback quando algo dá errado, mas também quando algo precisa acontecer sem interromper a execução de outras instruções no lote.
Use a seguinte sintaxe:
RAISERROR ( [ error_number ] , [ message ], [ state ])
Você também pode aplicar RAISERROR para encerrar a execução de uma instrução ou transmitir erros gerados por instruções SQL para outro aplicativo. Por exemplo, você pode gerar uma mensagem de erro que fará com que a execução do lote ou instrução atual pare, bem como exibir a mensagem especificada.
O uso mais comum para RAISERROR é gerar uma mensagem de erro quando os dados não atendem a alguns critérios, como inserir muitos caracteres em um campo que permite apenas 50 caracteres.
Raiserror(msg) é útil para lidar com erros que ocorrem durante o processamento e não exige que toda a transação falhe devido a um erro individual.
Agora você pode criar quantos erros quiser. Alegrar!
Lidando com erros
Para lidar com os erros, devemos ser capazes de controlá-los e descobrir todas as informações relacionadas. É necessário para qualquer caso que seja mais complicado do que digitar incorretamente PRINT em “Hello World”.
Uma maneira útil de detectar erros é usar TRY…CATCH. Essa ferramenta permite que você pegue seu código e o coloque em um ambiente onde possa ser examinado e manuseado com segurança. Lá, você pode extrair os dados dele. Decida se você deseja relatar o erro, saber mais sobre ele ou corrigi-lo.
Este sandbox do SQL Server é assim:
BEGIN TRY
--code to try
END TRY
BEGIN CATCH
--code to run if an error occurs
--is generated in try
END CATCH
O código que você deseja assistir é colocado entre BEGIN TRY e END TRY. Se ocorrerem erros, ele será enviado para a instrução CATCH. Isso nos fornece muitas funcionalidades úteis:
- ERROR_NUMBER retorna o número interno do erro
- ERROR_STATE retorna as informações sobre a fonte
- ERROR_SEVERITY retorna as informações sobre qualquer coisa, desde erros informativos a erros que os usuários do DBA podem corrigir etc.
- ERROR_LINE retorna o número da linha em que ocorreu um erro
- ERROR_PROCEDURE retorna o nome do procedimento armazenado ou função
- ERROR_MESSAGE retorna as informações mais essenciais e esse é o texto da mensagem do erro.
Aqui está o que obtemos quando tentamos dividir 1 por 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 você pode ver, a função TRY…CATCH é muito útil.
Resumo
Agora você sabe exatamente o que é o código de erro SQL, que tipos de erros existem, por que eles acontecem, como eles são colocados em sandbox e estudados, como criar seus sinais de erro, etc. Você está muito mais do que preparado para lidar com erros! Caso contrário, informe-nos e lançaremos mais guias no futuro. Boa sorte!