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.