2015-02-19 13:27 GMT-02:00 Matheus Saraiva <[email protected]>:

> Um.... Não conhecia essa sintaxe de insert. Para incapsular dentro de uma
> função, como ficaria o cabeçalho da função? Tipo, *funcInsertTeste(registros
> [tipo?])*
> Um outro detalhe é que não é possível prever a quantidade de registros, é
> variável.


Você irá precisar de um tipo composto, esse tipo pode ser um criado via
CREATE TYPE ou uma tabela. No caso da tabela você precisa informar todas
colunas da mesma, o que pode não ser necessário.

Segue um exemplo completo:

    /* Tabela de exemplo */
    CREATE TABLE xpto(id serial, a int, b text);
    /* Tipo composto apenas com os valores que serão passados à função */
    CREATE TYPE xpto_dados AS (a int, b text);
    /* Função em si, escolhi linguagem SQL por ser mais simples */
    CREATE OR REPLACE FUNCTION insere_xpto(ar_valores xpto_dados[])
    RETURNS SETOF integer /* o retorno será os "id"s inseridos */
    VOLATILE
    LANGUAGE SQL AS $$
        /* OBS: Repare que a posição no CREATE TYPE e no INSERT é a mesma */
        /* Insere em "xpto" */
        INSERT INTO xpto(a, b)
        /* Pegando cada valor do array (unnest retorna cada valor numa
linha) */
        SELECT *
        FROM unnest(ar_valores)
        RETURNING id;
    $$;

Daí para inserir, você deve chamar da seguinte forma:

    SELECT insere_xpto(array['(1, "foo")', '(2, "bar")', '(3,
"baz")']::xpto_dados[]);

Eu particularmente não gosto muito disso, até a sintaxe literal para tipo
composto é confuso, mas a decisão é sua. E também tenha em mente que esse
array inteiro ficará em memória, se forem muitos registros, é melhor você
considerar o uso do COPY.

Outra opção, caso queira, é usar VARIADIC. Para isso na função você usa:

    CREATE OR REPLACE FUNCTION insere_xpto(*VARIADIC* ar_valores
xpto_dados[])

Daí, na chamada fica um pouco mais simples (o array se torna implicitamente
cada parâmetro da função):

    SELECT insere_xpto('(1, "foo")', '(2, "bar")', '(3, "baz")');

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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a