1
resposta

Parametro id_instrutor se definida não deveria retornar apaenas um registro?

Olá, Então, dada a função salario_ok(id_instrutor) returns varchar, sabendo que o WHERE do SELECT é id = id_instrutor, quando eu chamo a função dessa forma: *SELECT salario_ok(3) FROM instrutor; * Não deveria retornar apenas o instrutor cujo o id é 3? Pq está retornando todos os instrutores?

CREATE OR REPLACE FUNCTION salario_ok(idinstrutor INTEGER) RETURNS VARCHAR AS 
$$
    DECLARE
        instrutor instrutor;
    BEGIN
        SELECT  FROM instrutor WHERE id = idinstrutor INTO instrutor;
         -- se o salário do instrutor for maior do que 200, está ok. Senão pode aumentar
        IF instrutor.salario> 200 THEN
            RETURN 'Salário está OK';
        ELSE
            RETURN 'Salário pode aumentar';
        END IF;
    END;
$$ LANGUAGE plpgsql;*

*SELECT salariook(3) FROM instrutor;

resultado:

1 "Salário pode aumentar"
2 "Salário pode aumentar"
3 "Salário pode aumentar"
4 "Salário pode aumentar"
5 "Salário pode aumentar"
6 "Salário pode aumentar"
7 "Salário pode aumentar"
8 "Salário pode aumentar"
9 "Salário pode aumentar"
1 resposta

Oi, Wesley, tudo certo por aí?

Peço desculpas por demorar a te responder.

Exatamente isso, a função deve retornar apenas as informações associadas ao id passado como parâmetro. Entretanto, analisando o código da função que você compartilhou, é possível notar que há um problema no seguinte trecho:

SELECT  FROM instrutor WHERE id = id_instrutor INTO instrutor;

Note que após a cláusula SELECT está faltando a definição das colunas da tabela de instrutores, essa etapa é importante para conseguirmos armazenar algo na variável instrutor. Nesse sentido, podemos adicionar um asterisco após o SELECT, informando que todos os campos da tabela devem ser levados em consideração.

SELECT * FROM instrutor WHERE id = id_instrutor INTO instrutor;

Ademais, existe outro ponto que gostaria de comentar, para isso, observe o comando abaixo:

SELECT salario_ok(3) FROM instrutor;

Quando o executamos, temos como resultado uma tabela em que todos os registros possuem a frase "Salário pode aumentar", isso ocorre em virtude do FROM instrutor, que pega o valor retornado pela função salario_ok e o repete várias vezes até que se atinja a quantidade de registros presentes na tabela instrutor. Logo, para obter somente o registro desejado, teremos que retirar FROM instrutor, chegando no seguinte comando:

SELECT salario_ok(3);

Com isso, teremos como resultado a frase correspondente ao salário do instrutor de id 5!

Wesley, caso queira visualizar o código por completo, aqui está:

CREATE OR REPLACE FUNCTION salario_ok(id_instrutor INTEGER) RETURNS VARCHAR AS 
$$
    DECLARE
        instrutor instrutor;
    BEGIN
        SELECT * FROM instrutor WHERE id = id_instrutor INTO instrutor;
         -- se o salário do instrutor for maior do que 200, está ok. Senão pode aumentar
        IF instrutor.salario > 200 THEN
            RETURN 'Salário está OK';
        ELSE
            RETURN 'Salário pode aumentar';
        END IF;
    END;
$$ LANGUAGE plpgsql;

SELECT salario_ok(5);

Espero ter ajudado! Caso surjam dúvidas após minha explicação ou durante os seus estudos, fico à disposição!

Um forte abraço.

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