Solução do exercicio sem o FOR para o percentual de grade. Sei que ha duas querys recuperando dados do SGBD, mas assim fica mais simples e mais rapido.
-- Solução do exercicio sem o FOR para percentual da grade
CREATE OR REPLACE FUNCTION cria_instrutor2 (nome_instrutor VARCHAR, salario_instrutor DECIMAL) RETURNS void AS $$
DECLARE
id_instrutor_inserido INTEGER;
media_salarial DECIMAL;
instrutores_recebem_menos INTEGER DEFAULT 0;
total_instrutores INTEGER DEFAULT 0;
salario DECIMAL;
percentual DECIMAL;
BEGIN
INSERT INTO instrutor (nome, salario) VALUES (nome_instrutor, salario_instrutor) RETURNING id INTO id_instrutor_inserido;
SELECT AVG(instrutor.salario) INTO media_salarial FROM instrutor WHERE id <> id_instrutor_inserido; -- calcula a media dos salarios
IF salario_instrutor > media_salarial THEN
INSERT INTO log_instrutores (informacao) values (nome_instrutor || ' recebe acima da media.');
END IF;
-- Salvar outro log dizendo que fulano recebe mais do que X% da grade de instrutores. AQUI ESTA O CODIGO QUE SUBSTITUI O LOOP
SELECT COUNT(*) INTO total_instrutores FROM instrutor WHERE id <> id_instrutor_inserido;
SELECT COUNT(*) INTO instrutores_recebem_menos FROM instrutor WHERE id <> id_instrutor_inserido AND salario_instrutor > salario;
percentual = instrutores_recebem_menos::DECIMAL / total_instrutores::DECIMAL * 100;
INSERT INTO log_instrutores (informacao) values (nome_instrutor || ' recebe mais do que ' || ROUND(percentual,2) ||'% da grade de instrutores.');
END;
$$ LANGUAGE plpgsql;