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