1
resposta

[Projeto] 05 Entendendo o funcionamento do CURSOR

Cursores
Esse assunto, foi um assunto que vi no curso de Analise e Desenvolvimento de Sistemas (UNITINS) na disciplina de banco de dados em SQL - Linguagem de Controle de Dados DCL com os assuntos transações, travamento de tabelas, procedure, privilégios - estabelecer privilégios dos usuários comuns e outros.

Sintaxe:

DECLARE nome_cursor CIRSOR FOR
(comando-select) FOR UPDATE OF nome-coluna\DELETE

OPEN nome_cursor

CLOSE nome_cursor

1 resposta

Excelente contribuição, Fábio! É muito bom ver a conexão entre o que você aprendeu na graduação da UNITINS e a aplicação prática no MySQL.

O CURSOR é, de fato, uma ferramenta fundamental quando precisamos sair do pensamento "em conjunto" (set-based) do SQL e passar para o processamento "linha a linha" (procedural). No contexto de Data Science e Procedures, ele é o que nos permite iterar sobre um conjunto de resultados para aplicar lógicas de negócio complexas que um simples UPDATE ou INSERT não resolveriam sozinhos.

Para complementar a sintaxe que você compartilhou, vale destacar o ciclo de vida completo de um cursor no MySQL, que segue quatro passos essenciais:

Ciclo de Vida do Cursor

  1. DECLARE: Define o cursor e a consulta SELECT que ele vai percorrer.
  2. OPEN: Executa a consulta e armazena os resultados na memória (abre o cursor).
  3. FETCH: Recupera a linha atual e move o ponteiro para a próxima. É aqui que você joga os valores das colunas em variáveis usando o comando INTO.
  4. CLOSE: Libera a memória alocada.

Exemplo Prático de Iteração

No MySQL, como não temos um comando "EOF" (End of File) automático, geralmente usamos um Handler (manipulador de erro) para saber quando os dados acabaram:

-- Exemplo de lógica dentro de uma Procedure
DECLARE fim_do_cursor INT DEFAULT FALSE;
DECLARE v_nome VARCHAR(50);

-- 1. Declaração
DECLARE c1 CURSOR FOR SELECT nome FROM tabela_exemplo;

-- Manipulador para interromper o loop
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim_do_cursor = TRUE;

-- 2. Abertura
OPEN c1;

read_loop: LOOP
    -- 3. Captura dos dados
    FETCH c1 INTO v_nome;
    
    IF fim_do_cursor THEN
        LEAVE read_loop;
    END IF;

    -- [Sua lógica aqui, ex: Processar nome]
    
END LOOP;

-- 4. Fechamento
CLOSE c1;

Pontos de Atenção (Dica de Performance)

Como você mencionou o assunto de DCL e travamento de tabelas, é importante lembrar que cursores podem ser custosos para o banco de dados se a tabela for muito grande, pois eles mantêm recursos abertos enquanto o loop é executado. Em Data Science, sempre que puder resolver com uma query estruturada (JOIN, GROUP BY), prefira-a; deixe o cursor para quando a lógica linha a linha for estritamente necessária.

Parabéns pelo XP e pelo engajamento na comunidade! Continue compartilhando esses resumos, eles ajudam muito a fixar o conteúdo.