Eu acreditava que esta parte da instrução deveria fazer com que não fosse possível fazer inserções repetidas, porém não surte efeito.
IF NOT FOUND THEN
INSERT INTO INSTRUTOR (NOME, SALARIO) VALUES (NOME_INSTRUTOR, SALARIO_INSTRUTOR) RETURNING ID INTO ID_INSTRUTOR_INSERIDO;
END IF;
CREATE OR REPLACE FUNCTION CRIA_INSTRUTOR (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(10, 2);
BEGIN
IF NOT FOUND THEN
INSERT INTO INSTRUTOR (NOME, SALARIO) VALUES (NOME_INSTRUTOR, SALARIO_INSTRUTOR) RETURNING ID INTO ID_INSTRUTOR_INSERIDO;
END IF;
SELECT AVG(INSTRUTOR.SALARIO) INTO MEDIA_SALARIAL FROM INSTRUTOR WHERE ID <> ID_INSTRUTOR_INSERIDO;
IF SALARIO_INSTRUTOR > MEDIA_SALARIAL THEN
INSERT INTO LOG_INSTRUTORES (INFORMACAO) VALUES (NOME_INSTRUTOR || 'Recebe acima da média');
END IF;
FOR SALARIO IN SELECT INSTRUTOR.SALARIO FROM INSTRUTOR WHERE ID <> ID_INSTRUTOR_INSERIDO LOOP
TOTAL_INSTRUTORES := TOTAL_INSTRUTORES + 1;
IF SALARIO_INSTRUTOR > SALARIO THEN
INSTRUTORES_RECEBEM_MENOS := INSTRUTORES_RECEBEM_MENOS + 1;
END IF;
END LOOP;
PERCENTUAL = INSTRUTORES_RECEBEM_MENOS::DECIMAL / TOTAL_INSTRUTORES::DECIMAL * 100;
INSERT INTO LOG_INSTRUTORES (INFORMACAO)
VALUES (NOME_INSTRUTOR || ' Recebe mais do que' || PERCENTUAL || '% da grade de instrutores');
END;
$$ LANGUAGE PLPGSQL;