Introdução aos Cursores em SQL

Os cursores são espaços de trabalho temporários criados na memória para processar alguns comandos SQL em um conjunto de dados. Definição muito complicada? Vamos entender. Pense nos Cursores como para cada loop no SQL. Você deseja executar uma tarefa em um conjunto de linhas de dados, usa o cursor. Digamos que você tenha uma tabela de funcionários que detenha o salário de cada funcionário da organização. Você deseja aumentar o salário de cada funcionário em uma determinada porcentagem. É aqui que você usaria um cursor. 'Como' foi ilustrado mais adiante neste artigo.

Portanto, os cursores criam um espaço de trabalho temporário com o conjunto de linhas selecionado e um ponteiro que aponta para a linha atual. Esse conjunto de linhas, no qual o cursor executará a operação desejada, é chamado de Conjunto de Dados Ativos. O ponteiro recupera as linhas do conjunto de resultados, uma por uma. Você pode executar qualquer operação SQL, uma linha por vez.

Cursores implícitos

Os cursores implícitos, como o nome indica, são gerados pelo analisador SQL para consultas DML. As consultas DML são consultas de manipulação de dados. Essas consultas manipulam ou alteram os dados. Eles não interferem na estrutura ou no esquema do banco de dados. Consultas como SELECT, INSERT, UPDATE e DELETE geram um cursor implícito. Cursores implícitos estão ocultos para o usuário final.

Cursores explícitos

Cursores explícitos são cursores gerados pelo usuário. Quando um usuário instrui o analisador SQL a criar um cursor para um conjunto ativo, o cursor assim criado é chamado de cursor explícito. O conjunto ativo é definido por meio de uma consulta SELECT pelo usuário. Cobriríamos cursores explícitos em detalhes neste artigo.

Ações do cursor - O ciclo de vida de um cursor

O ciclo de vida de um cursor geralmente envolve cinco estágios:

1. Declarar: O primeiro passo é declarar um cursor. Esta etapa instrui o sistema a gerar um cursor com o conjunto de dados fornecido. O conjunto de dados é construído usando uma instrução SQL. Nesse estágio, o conjunto ativo é criado, mas o espaço de trabalho temporário do cursor ainda não está aberto na memória.

2. Abrir: Em seguida, o sistema é instruído a abrir o cursor. Nesse estágio, o espaço de trabalho temporário é carregado na memória com o conjunto ativo e é gerado um ponteiro que aponta para a primeira linha do conjunto ativo.

3. Buscar: Esta é a etapa recorrente em todo o processo. A linha atual apontada pelo ponteiro é buscada e a tarefa desejada é executada nos dados da linha. O ponteiro se move para a próxima linha do cursor.

4. Fechar: Após a manipulação dos dados, o cursor precisa ser fechado.

5. Desalocar: Esta é a etapa final para excluir o cursor e liberar a memória, o processador e outros recursos do sistema alocados ao cursor.

Cursores explícitos - em ação!

Ok, agora temos uma compreensão básica do que são os cursores e como eles funcionam. É hora de sujar as mãos e criar um cursor explícito.

A terminologia de cursores em SQL

Vamos entender as terminologias usadas nesta sintaxe.

Escopo do Cursor

  • O escopo do cursor pode ser GLOBAL ou LOCAL . Um cursor global está disponível em toda a conexão. Um cursor local tem escopo limitado apenas aos procedimentos armazenados, funções ou à consulta que contém o cursor.
  • Esse é o recurso específico do MS SQL Server. O MySQL suporta apenas cursores com escopo local.

Movimento do Cursor

  • O MS SQL Server também oferece a opção de definir o movimento do cursor. Pode ser o modo Forward_Only convencional que move o ponteiro da primeira linha até a última linha por linha. Ou, pode ser rolado para a primeira, a última, a anterior ou a próxima linha.
  • Os cursores no MySQL não são roláveis.

Tipo de cursor

  • Um cursor pode ser estático, pois pode armazenar em cache o conjunto ativo até a desalocação e pode fazer malabarismos para frente e para trás através desse conjunto ativo em cache. Um cursor pode ser rápido apenas no modo estático.
  • Também pode ser dinâmico para permitir a adição ou exclusão de linhas no conjunto ativo enquanto o cursor está aberto. Essas alterações não são visíveis para outros usuários do cursor no modo de conjunto de teclas. Os cursores no MySQL são apenas fast_forward.

Bloqueio do Cursor

  • Os bloqueios do cursor são úteis em um ambiente multiusuário. Eles bloqueiam a linha para que dois usuários não operem nos mesmos dados simultaneamente. Isso garante a integridade dos dados.
  • Um bloqueio somente leitura afirma que a linha não pode ser atualizada.
  • Os bloqueios de rolagem bloqueiam a linha à medida que são buscados no cursor, garantindo que a tarefa seja bem-sucedida e que dados atualizados estejam disponíveis fora do cursor. Tentativas otimistas de atualizar a linha sem nenhum bloqueio. Portanto, se a linha tiver sido atualizada fora do cursor, a tarefa não terá êxito.
  • O MySQL suporta apenas bloqueios somente leitura. Isso significa que o MySQL não atualiza a tabela atual, mas copia os dados para executar os comandos de atualização.

Portanto, vemos que essas opções estão disponíveis apenas no MS SQL Server. Isso torna a sintaxe dos cursores do MySQL ainda mais simples.

Exemplo

Vamos agora atualizar o salário dos funcionários em nossa tabela Funcionários.

Nós estaríamos usando os dados abaixo nesses cursores no exemplo SQL.

Nosso código do cursor seria o seguinte:

DECLARE @sal float
DECLARE @newsal float
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = @newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur

E a saída após executar o comando do cursor acima seria:

Conclusão - Cursores em SQL

Assim, vimos o que são os cursores, como usá-los e onde evitá-los. Os cursores provam ser um utilitário útil para desenvolvedores, mas ao custo de desempenho. Portanto, tenha cuidado ao optar por cursores.

Artigos recomendados

Este é um guia para os cursores no SQL. Aqui discutimos os tipos, ciclo de vida e terminologia do cursor no SQL com exemplos. Você também pode consultar nossos outros artigos sugeridos -

  1. Tipos de junções no SQL
  2. Comando SQL Alter
  3. Exibições SQL
  4. Ferramentas de Gerenciamento SQL
  5. Tipos de cursores em PL / SQL
  6. Os 6 principais tipos de junções no MySQL com exemplos