Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Resolução do desafio 2

Caso o instrutor inserido receba mais do que 100% dos instrutores existentes, modifique a inserção para que ele passe a receber o mesmo que o instrutor mais bem pago.

/Não sei se é porque coloquei dois select no begin, ele aponta um erro de ; no end. Como posso solucionar este caso?/

CREATE OR REPLACE FUNCTION cria_instrutor() RETURNS TRIGGER AS $$ 
    DECLARE
        media_salarial DECIMAL;
        maior_salario DECIMAL;
        instrutores_recebem_menos INTEGER DEFAULT 0;
        total_instrutores INTEGER DEFAULT 0;
        salario DECIMAL;
        percentual DECIMAL (5,2);
    BEGIN
        SELECT AVG(instrutor.salario) INTO media_salarial FROM instrutor WHERE id <> NEW.id;
        SELECT MAX(instrutor.salario) INTO maior_salario FROM instrutor WHERE id <> NEW.id;

        IF NEW.salario > maior_salario THEN
            NEW.salario := maior_salario;        
        ELSE IF NEW.salario > media_salarial THEN
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe acima da média');
        ELSE 
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe abaixo da média');
        END IF;

        FOR salario IN SELECT instrutor.salario FROM instrutor WHERE id <> NEW.id LOOP 
            total_instrutores := total_instrutores + 1;

            IF NEW.salario > 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 (NEW.nome || ' recebe mais do que' || percentual || '% da grade de instrutores');

        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;
2 respostas
solução!

Olá Sandi, tudo bem?

Peço desculpas pela demora no retorno.

Parabéns Sandi, ficou muito legal a sua função. O erro retornado na sua função é bem comum de acontecer, principalmente quando trabalhamos com um código grande. O erro ocorreu pelo fato de você ter esquecido de fechar um IF neste bloco aqui:

 IF NEW.salario > maior_salario THEN
            NEW.salario := maior_salario;        
        ELSE
 IF NEW.salario > media_salarial THEN
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe acima da média');
        ELSE 
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe abaixo da média');
        END IF;

Se analisarmos esse trecho da sua função, é aberto mais de um IF, um no inicio do bloco e um após o primeiro ELSE, mas existe apenas um END IF, fechando apenas um IF. Então, quando tentamos executar a criação da função, ele retornad um erro no END.

Uma forma de resolver este problema, é informar mais um END IF, no final deste bloco, desta forma:

 IF NEW.salario > maior_salario THEN
            NEW.salario := maior_salario;        
        ELSE 
            IF NEW.salario > media_salarial THEN
                INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe acima da média');
        ELSE
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe abaixo da média');
        END IF;
        END IF;

Outra forma que você também pode utilizar Sandi, é ao invés de utilzar o ELSE IF, utilizar o ELSIF, assim você só precisaria se preocupar em fechar um IF, dessa forma:

IF NEW.salario > maior_salario THEN
            NEW.salario := maior_salario;        
        ELSIF NEW.salario > media_salarial THEN
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe acima da média');
        ELSE
            INSERT INTO log_instrutores (informacao) VALUES (NEW.nome || 'recebe abaixo da média');
        END IF;

Vou deixar aqui para você, o link da documentação do PostgreSQL onde é abordado sobre este assunto, e que você pode consultar caso queira ver mais sobre isso, mas caso você tenha uma nova dúvida é só falar Sandi.

Espero ter ajudado e bons estudos!

Obrigada, consegui executar a função!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software