No universo PL/SQL, os cursores e loops são ferramentas poderosas que permitem o acesso e manipulação de dados de maneira estruturada e controlada. Um cursor é um objeto de banco de dados que recupera linhas de um conjunto de resultados. Um loop, por outro lado, é uma estrutura de controle que permite a repetição de certos blocos de código.

Vamos ver dois exemplos práticos de como essas estruturas são usadas em conjunto.

Exemplo 1: Relatório de Vendas

Suponha que você trabalhe para uma empresa de varejo e precise produzir um relatório de vendas por produto. Você tem uma tabela ‘VENDAS’ com as colunas ‘PRODUTO_ID’, ‘PRECO’ e ‘DATA_VENDA’. Neste exemplo, vamos abrir um cursor para selecionar os dados e utilizar um loop para processar cada linha.

DECLARE
    CURSOR c_vendas IS
        SELECT PRODUTO_ID, SUM(PRECO) AS TOTAL_VENDAS
        FROM VENDAS
        GROUP BY PRODUTO_ID;
    
    v_produto_id VENDAS.PRODUTO_ID%TYPE;
    v_total_vendas NUMBER;
BEGIN
    OPEN c_vendas;
    LOOP
        FETCH c_vendas INTO v_produto_id, v_total_vendas;
        EXIT WHEN c_vendas%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Produto ID: ' || v_produto_id || ', Total de Vendas: ' || v_total_vendas);
    END LOOP;
    CLOSE c_vendas;
END;
/

Neste exemplo, o cursor ‘c_vendas’ é declarado para selecionar o total de vendas por produto. No loop, cada linha é buscada e processada, exibindo o ID do produto e o total de vendas.

Exemplo 2: Atualizando Preços de Produtos

Em outro cenário, digamos que você precise aumentar o preço de todos os produtos em 10%. Você tem uma tabela ‘PRODUTOS’ com as colunas ‘PRODUTO_ID’ e ‘PRECO’. Aqui, novamente, utilizaremos um cursor e um loop para fazer essa atualização.

DECLARE
    CURSOR c_produtos IS
        SELECT PRODUTO_ID, PRECO
        FROM PRODUTOS;
        
    v_produto_id PRODUTOS.PRODUTO_ID%TYPE;
    v_preco PRODUTOS.PRECO%TYPE;
BEGIN
    OPEN c_produtos;
    LOOP
        FETCH c_produtos INTO v_produto_id, v_preco;
        EXIT WHEN c_produtos%NOTFOUND;
        UPDATE PRODUTOS
        SET PRECO = v_preco * 1.10
        WHERE PRODUTO_ID = v_produto_id;
    END LOOP;
    CLOSE c_produtos;
    COMMIT;
END;
/

Neste segundo exemplo, o cursor ‘c_produtos’ é usado para selecionar cada produto da tabela ‘PRODUTOS’. Para cada produto, o preço é atualizado para ser 10% maior do que o preço atual.

Outra forma prática e poderosa de usar cursores em PL/SQL é através do uso de um “cursor FOR loop”. Este é um tipo especial de loop que implicitamente declara um cursor e administra seu ciclo de vida, simplificando a manipulação de dados.

Exemplo 3: Relatório de Vendas com Cursor FOR loop

Vamos modificar o primeiro exemplo usando esta abordagem:

BEGIN
    FOR rec IN (SELECT PRODUTO_ID, SUM(PRECO) AS TOTAL_VENDAS
                FROM VENDAS
                GROUP BY PRODUTO_ID) 
    LOOP
        DBMS_OUTPUT.PUT_LINE('Produto ID: ' || rec.PRODUTO_ID || ', Total de Vendas: ' || rec.TOTAL_VENDAS);
    END LOOP;
END;
/

Neste exemplo, o cursor é declarado implicitamente dentro do bloco BEGIN e não é necessário abrir, buscar e fechar o cursor manualmente. A estrutura do loop FOR cuida disso para nós.

Exemplo 4: Atualizando Preços de Produtos com Cursor FOR loop

Vamos refazer o segundo exemplo utilizando a mesma abordagem:

BEGIN
    FOR rec IN (SELECT PRODUTO_ID, PRECO
                FROM PRODUTOS) 
    LOOP
        UPDATE PRODUTOS
        SET PRECO = rec.PRECO * 1.10
        WHERE PRODUTO_ID = rec.PRODUTO_ID;
    END LOOP;
    COMMIT;
END;
/

Novamente, o cursor é declarado implicitamente e o loop FOR cuida de todas as operações de controle do cursor. Essa abordagem torna o código mais limpo e fácil de entender.

Esses exemplos adicionais mostram que há várias maneiras de alcançar o mesmo objetivo em PL/SQL, cada uma com suas próprias vantagens. É importante compreender todas essas ferramentas para que você possa escolher a que melhor se adapta à sua situação.

Sobre o autor

Pós graduado em Gestão de Projetos em Tecnologia da Informação pela UNIASSELVI.
Esposo e Pai, curto atividades ao ar livre (Bike, SUP, Natação, Caminhar, Brincar no campo)

Atua com Banco de Dados Oracle desde de 2007. Atualmente é DBA Senior na FLUIDATA Serviços em Banco de dados (www.fluidata.com.br)

Principais atividade Banco de dados:

Implementação, migração, gerenciamento e suporte a produtos Oracle (8i, 9i, 10g, 11g, 12c, 18c, 19c RAC), multiplataforma;
Implementação, migração, gerenciamento e suporte a produtos Microsoft SQL Server (2008 - 2019);
Implementação, migração, gerenciamento e suporte a produtos PostgreSQL (9.3 - 14);
Monitoramento de ambientes 24×7;
Backup e Recovery;
Performance e Tuning;
Alta disponibilidade (HA);
EM database/grid/cloud control;
Conversão de databases;
Standby database / Oracle Data Guard;

Certificações:

Oracle Cloud Infrastructure 2019 Certified Architect AssociateOracle Cloud Infrastructure 2019 Certified Architect Associate
Oracle Database 12c Administrator Certified ProfessionalOracle Database 12c Administrator Certified Professional
Exadata Database Machine Models X2-2 and X2-8 Technology Support SpecialistExadata Database Machine Models X2-2 and X2-8 Technology Support Specialist
Oracle Database 11g Support SpecialistOracle Database 11g Support Specialist
OCP 11g - Oracle Certified Professional AdministratorOCP 11g - Oracle Certified Professional Administrator
OPN Certified Specialist 10g - PartnerNetwork Certified SpecialistOPN Certified Specialist 10g - PartnerNetwork Certified Specialist
Oracle Database 10g Real Applications Clusters AdministratorCertified ExpertOracle Database 10g Real Applications Clusters AdministratorCertified Expert
Oracle Database 10g: Managing Oracle on Linux Certified ExpertOracle Database 10g: Managing Oracle on Linux Certified Expert
OCP 10g - Oracle Certified Professional AdministratorOCP 10g - Oracle Certified Professional Administrator

Principais atividades DEVOPS:

PHP
ASP.net
C#
Docker
Golang
C++
Delphi
Python
HTML5
JavaScript

Você também pode gostar: