A linguagem PL/pgSQL do PostgreSQL oferece várias funcionalidades, entre as quais se destacam o uso de cursores e loops.
Cursores
Um cursor é uma estrutura de controle de banco de dados que permite a manipulação de linhas retornadas por uma consulta SELECT. O cursor permite que as linhas sejam manipuladas uma a uma, o que pode ser útil em situações que exigem o tratamento individual de cada linha de resultado.
Exemplo de Cursor
Vamos considerar uma tabela ‘funcionarios’, que contém informações sobre os funcionários de uma empresa.
CREATE TABLE funcionarios (
id serial PRIMARY KEY,
nome VARCHAR (100),
salario NUMERIC (10, 2)
);
INSERT INTO funcionarios (nome, salario)
VALUES ('Pedro', 2000.00), ('Ana', 3000.00), ('João', 2500.00);
Agora, vamos escrever um bloco de código PL/pgSQL que use um cursor para percorrer todas as linhas da tabela ‘funcionarios’ e imprimir o nome e salário de cada funcionário.
DO $$
DECLARE
cur CURSOR FOR SELECT nome, salario FROM funcionarios;
rec RECORD;
BEGIN
OPEN cur;
LOOP
FETCH NEXT FROM cur INTO rec;
EXIT WHEN NOT FOUND;
RAISE NOTICE 'Nome: %, Salário: %', rec.nome, rec.salario;
END LOOP;
CLOSE cur;
END $$;
Loops
Loops são estruturas de controle que permitem a execução repetida de um bloco de código.
Exemplo de Loop
Vamos considerar uma tabela ‘produtos’, que contém informações sobre os produtos de uma loja.
CREATE TABLE produtos (
id serial PRIMARY KEY,
nome VARCHAR (100),
preco NUMERIC (10, 2)
);
INSERT INTO produtos (nome, preco)
VALUES ('Produto A', 20.00), ('Produto B', 30.00), ('Produto C', 25.00);
Agora, vamos escrever um bloco de código PL/pgSQL que use um loop FOR para percorrer todas as linhas da tabela ‘produtos’ e aumentar o preço de cada produto em 10%.
DO $$
DECLARE
rec produtos%ROWTYPE;
BEGIN
FOR rec IN SELECT * FROM produtos
LOOP
UPDATE produtos SET preco = preco * 1.10 WHERE id = rec.id;
END LOOP;
END $$;
Vantagens e Desvantagens
Vantagens:
- Controle Preciso: Cursores e loops permitem um controle muito preciso sobre o processamento de linhas, permitindo manipular cada linha individualmente.
- Flexibilidade: Os cursores podem ser usados para implementar lógicas complexas que seriam difíceis ou impossíveis de implementar usando apenas SQL.
- Performance: Em alguns casos, o uso de cursores pode ser mais eficiente do que a execução de múltiplas consultas SQL.
Desvantagens:
- Complexidade: Cursores e loops podem tornar o código mais complexo e difícil de entender.
- Performance: Em alguns casos, o uso de cursores e loops pode ser menos eficiente do que a execução de uma única consulta SQL bem otimizada.
Esperamos que esses exemplos tenham ajudado a entender como usar cursores e loops no PL/pgSQL. Lembre-se, a escolha de quando e como usar essas funcionalidades depende do problema específico que você está tentando resolver.