Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

ERROR: faltando "FROM or IN" ao fim da expressão SQL

Boa noite,

tentei resolver de todas maneiras mas continua dando esse erro: ERROR:faltando "FROM or IN" ao fim da expressão SQL LINE 18: FETCH cursor_salario INTO salario; ^ SQL state: 42601 Character: 606

no trecho de código abaixo.

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

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

        SELECT instrutores_internos(NEW.id) INTO cursor_salarios;
        LOOP
            FETCH cursor_salario INTO salario;
            EXIT WHEN NOT FOUND;
            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;
        ASSERT percentual < 100::DECIMAL, 'Instrutores novos não podem receber mais que os antigos';

        INSERT INTO log_instrutores (informacao, media_do_momento, teste) 
        VALUES (NEW.nome || ' recebe mais do que ' || instrutores_recebem_menos || ' de ' || total_instrutores || 
                ' instrutores (' || percentual || '%) da grade de instrutores', media_salarial, '');
        RETURN NEW;
    END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION instrutores_internos(id_instrutor INTEGER) RETURNS refcursor AS $$
    DECLARE
        cursor_salario refcursor; 
    BEGIN
        OPEN cursor_salario FOR SELECT instrutor.salario FROM instrutor WHERE id <> id_instrutor AND salario > 0;

        RETURN cursor_salario;
    END;
$$ LANGUAGE plpgsql;

Agradeceria qualquer ajuda a consertar qualquer erro que eu tenha cometido. Obrigado.

1 resposta
solução!

Resolvido, esqueci um S em "FETCH cursor_salario INTO salario;", o certo era cursor_salarios.

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