1
resposta

Erro na inserção dos dados

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;

    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;

        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_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 que ' || '% da grade de instrutores');
    END;
$$ LANGUAGE plpgsql;


SELECT * FROM instrutor;

SELECT cria_instrutor('Calvo Diego', 5500);

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Boa tarde,

na linha:

"FOR salario IN SELECT instrutor.salario FROM instrutor WHERE id_instrutor_inserido LOOP"

a instrução WHERE esta sem comparação com nenhuma outra variável. Então o que o SGDB faz é verificar se é TRUE. Por isso ele dá o erro dizendo que o argumento é inteiro e deveria ser Booleano. Eu acredito que esse WHERE não deveria estar ai dado que a ideia é percorrer toda a tabela instrutor.

Abs,