Em Sex, 2015-02-20 às 09:43 -0200, Matheus de Oliveira escreveu


> 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")');
>  
> 
Dei uma olhada na documentação, corrija-me se eu estiver errado, mas não
é necessário criar um tipo composto. Quando uma tabela é criada um tipo
composto com o nome e com os campos da tabela também é criado.
Não posso usar VARIADIC pois a função receberá outros parâmetros além do
tipo composto, exemp: funcInsert(nome varchar, pai int, mae int,
nascimento date, filhos TipoComposto[]).



_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a