1
resposta

[Sugestão] Resolução dos Desafios da Aula 1

Aqui estão as minhas resoluçẽs para os desafios da Aula 1.

Desafio 1: Caso o instrutor inserido receba acima da média, cancele a instrução, ou seja, não permita que a inserção ocorra.

-- Deletando o TRIGGER já existente.
DROP TRIGGER create_instructors_log ON instructor;

-- Alterando a função.
CREATE OR REPLACE FUNCTION new_instructor() RETURNS TRIGGER AS $$
    DECLARE
        average_salary DECIMAL;
        total_instructors INTEGER DEFAULT 0;
        low_salary_instructors INTEGER DEFAULT 0; 
        salary DECIMAL; 
        percentage DECIMAL(5, 2);
    BEGIN
        SELECT AVG(instructor.salary) FROM instructor WHERE id != NEW.id INTO average_salary; -- Calcula a média salarial dos instrutores sem contar com o novo instrutor, e armazena o cálculo em average_salary.
        
        IF NEW.salary > average_salary THEN -- Se o salário do instrutor novato for maior do que a média salarial antes da sua adição.
            INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe acima da média atual dos instrutores e não será adicionado.');
            RETURN NULL; -- Invalida o INSERT e retorna nulo.
        END IF;
        
        FOR salary IN SELECT instructor.salary FROM instructor WHERE id != NEW.id LOOP -- Para cada salário na tabela de instrutores, com exclusão do instrutor novato.
            total_instructors := total_instructors + 1; -- Contabiliza o número de instrutores passados no FOR.
            
            IF NEW.salary > salary THEN -- Se o salário do instrutor novato for maior do que o salário verificado no FOR.
                low_salary_instructors := low_salary_instructors + 1; -- Aumenta em 1 unidade o valor do número total de instrutores com menor salário que o novo instrutor.
            END IF;
        END LOOP;
        
        percentage = low_salary_instructors::DECIMAL / total_instructors::DECIMAL * 100; -- Cálculo da porcentagem do número de instrutores com menor salário do que o instrutor novato.
        
        INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe mais do que ' || percentage || ' % da grade atual de instrutores.'); -- Adiciona ao log uma mensagem informando a porcentagem.
        
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

-- Recriando o TRIGGER.
CREATE TRIGGER create_instructors_log BEFORE INSERT ON instructor
    FOR EACH ROW EXECUTE FUNCTION new_instructor();

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.

-- Deletando o TRIGGER já existente.
DROP TRIGGER create_instructors_log ON instructor;

-- Alterando a função.
CREATE OR REPLACE FUNCTION new_instructor() RETURNS TRIGGER AS $$
    DECLARE
        average_salary DECIMAL;
        total_instructors INTEGER DEFAULT 0;
        low_salary_instructors INTEGER DEFAULT 0; 
        salary DECIMAL; 
        percentage DECIMAL(5, 2);
    BEGIN
        SELECT AVG(instructor.salary) FROM instructor WHERE id != NEW.id INTO average_salary; -- Calcula a média salarial dos instrutores sem contar com o novo instrutor, e armazena o cálculo em average_salary.
        
        IF NEW.salary > average_salary THEN -- Se o salário do instrutor novato for maior do que a média salarial antes da sua adição.
            INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe acima da média atual dos instrutores.');
        END IF;
        
        FOR salary IN SELECT instructor.salary FROM instructor WHERE id != NEW.id LOOP -- Para cada salário na tabela de instrutores, com exclusão do instrutor novato.
            total_instructors := total_instructors + 1; -- Contabiliza o número de instrutores passados no FOR.
            
            IF NEW.salary > salary THEN -- Se o salário do instrutor novato for maior do que o salário verificado no FOR.
                low_salary_instructors := low_salary_instructors + 1; -- Aumenta em 1 unidade o valor do número total de instrutores com menor salário que o novo instrutor.
            END IF;
        END LOOP;
        
        percentage = low_salary_instructors::DECIMAL / total_instructors::DECIMAL * 100; -- Cálculo da porcentagem do número de instrutores com menor salário do que o instrutor novato.
        
        IF percentage >= 100.00 THEN 
            SELECT MAX(instructor.salary) FROM instructor INTO NEW.salary; -- Seleciona o maior salário em 'salary' da tabela 'instructor' e armazena esse valor em NEW.salary.
        END IF;
        
        INSERT INTO instructors_log(information) VALUES (NEW.name || ' recebe mais do que ' || percentage || ' % da grade atual de instrutores e terá seu salário alterado para o maior valor atual.'); -- Adiciona ao log uma mensagem informando a relação entre a porcentagem salarial dos instrutores e a alteração que será realizada no valor do salário do instrutor adicionado.
        
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;

-- Recriando o TRIGGER.
CREATE TRIGGER create_instructors_log BEFORE INSERT ON instructor
    FOR EACH ROW EXECUTE FUNCTION new_instructor();

Espero ter ajudado! Se houver algo que possa ser melhorado, por favor, me digam!

Abraço e bons estudos!

1 resposta

Oii, Yale! Tudo bem?

Parabéns por ter concluído a atividade e pela dedicação aos realizar os exercícios propostos durante o curso!

Continue se empenhando nos estudos e qualquer dúvida, não hesite em recorrer ao fórum.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!