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