2014/1/17 Flavio Henrique Araque Gurgel <fha...@gmail.com>

>  Um detalhe: esse exemplo não funcionaria por que não dá para usar
>>> EXECUTE com SELECT.
>>>
>>
>> Use PERFORM quando precisar gerar consulta dinâmica que retorne
>> resultados, como SELECT.
>>
>
> Eu só esqueci de acrescentar que os resultados serão *descartados* pelo
> perform. A utilidade dele é justamente essa, por exemplo, executar uma
> função, um SELECT...INTO, etc.
>
>
Acho que há uma confusão dos colegas nas três afirmações acima... Vou
resumir tudo abaixo para tentar esclarecer.

1. EXECUTE com SELECT é possível sim, por exemplo:

    a) uma única linha:

        EXECUTE 'SELECT ...' INTO minha_variavel;

    b) várias linhas:

        FOR variavel_record IN EXECUTE 'SELECT ...' LOOP
                -- usar variavel_record.coluna1, ...
        END LOOP;

2. O comando PERFORM não serve para executar consultas dinâmicas, apenas
para consultas "estáticas" (ou seja, não contidas numa variável ou
expressão). Consultas dinâmicas, ignorando ou não o resultado, sempre deve
ser usado o EXECUTE. É um erro que tenho visto bastante ultimamente, não
sei o porquê.

3. De fato o PERFORM descarta o valor. A palavra PERFORM deve ser usado
**exatamente** no lugar de onde estaria um SELECT, mas o resultado desse
SELECT deve ser descartado.

Para exemplificar um PERFORM, se você que chamar a função setval, via SQL
direto poderia simplesmente usar:

    SELECT setval(...);

Via PL/pgSQL, também pode usar a forma acima, mas precisa
**obrigatoriamente** "salvar" o resultado numa variável:

    SELECT setval(...) INTO variavel;

Agora, se quiser ignorar o resultado (ou seja, não salvar o valor na
variável), basta usar o mesmo modelo de SQL mas trocando a palavra SELECT
por PERFORM (que só é válido em PL/pgSQL, não SQL puro):

    PERFORM setval(...);

Espero que tenha esclarecido (e não confundido mais, :P ).

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a