1
resposta

Como eu faço para não gerar repetidos?

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;
1 resposta

boa tarde, acho que esta faltando uma query para consultar se a categoria existe no banco de dados, mais ou menos assim:

select ID into ID_INSTRUTOR_INSERIDO from instrutor where NOME = NOME_INSTRUTOR;

De repente, mudaria o nome da variavel para ID_INSTRUTOR, ja que havera situacoes em que ele nao precisara ser inserido. O codigo que peguei é parecido com deste video https://cursos.alura.com.br/course/postgresql-procedures/task/80312.