Tentei reproduzir a atividade sozinho e cheguei em outra solução igualmente funcional, mas com um cálculo diferente do total de instrutores a partir de um select da tabela e não de um contator via loop. Estou em dúvida de qual seria a melhor opção em questão de desempenho entre o caminho que segui e a tratativa do professor
CREATE TABLE log2 (
id SERIAL PRIMARY KEY,
descricao VARCHAR(255),
data_hora TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE OR REPLACE FUNCTION adiciona_instrutor (nome_instrutor VARCHAR, salario_instrutor DECIMAL) RETURNS void AS $$
DECLARE
media_salarial DECIMAL;
id_novo_instrutor INTEGER;
instrutores_mal_pagos INTEGER;
total_instrutores INTEGER;
porcentagem DECIMAL;
BEGIN
SELECT AVG (instrutor.salario) FROM instrutor INTO media_salarial;
INSERT INTO instrutor (nome, salario) VALUES (nome_instrutor, salario_instrutor) RETURNING id INTO id_novo_instrutor;
/*Diferença a partir daqui, coloquei todas as ações dentro do if*/
IF salario_instrutor > media_salarial THEN
INSERT INTO log2 (descricao) VALUES (nome_instrutor || ' tem um salario muito alto');
SELECT COUNT(*) FROM instrutor WHERE id <> id_novo_instrutor INTO total_instrutores;
SELECT COUNT(*) FROM instrutor WHERE id <> id_novo_instrutor AND salario < salario_instrutor INTO instrutores_mal_pagos;
SELECT instrutores_mal_pagos::DECIMAL / total_instrutores::DECIMAL *100 INTO porcentagem;
INSERT INTO log2 (descricao) VALUES (nome_instrutor || ' recebe mais do que ' || ROUND(porcentagem, 2) || '% do quadro');
END IF;
END;
$$ LANGUAGE plpgsql;