Em Sex, 2015-02-20 às 15:46 -0200, Matheus Saraiva escreveu:
> Em Sex, 2015-02-20 às 12:37 -0200, Matheus de Oliveira escreveu:
>
> >
> > 2015-02-20 12:13 GMT-02:00 Matheus Saraiva
> > <[email protected]>:
> >
> > 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.
> >
> >
> >
> > 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.
> >
> >
> >
> >
> > Você está correto, e é como eu comentei acima (em destaque - para
> > quem aceita e-mail com HTML).
> >
> >
> >
> > 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[]).
> >
> >
> >
> >
> >
> > Sem problemas, você pode usar o último parâmetro como VARIADIC. A
> > escolha se isso é melhor ou não é sua, pelo caso eu diria que pode
> > ficar confuso.
> >
>
> Vamos para a pratica, exemplo:
>
> Tabela Clientes (id, nome, telefone, endereco, datanasc), tabela
> Filhos(nome, idade, genitor integer FK - > CLIENTES)
>
> Partindo do principio que todas as tabela tem um tipo composto pensei
> na função assim (Esse exemplo não mostra caracteres e algumas palavras
> chave obrigatórias pela sintaxe. A intenção é apenas exemplificar a
> lógica.):
>
> funcInsertCliente(f_nome varchar, f_telefone varchar, f_endereco
> integer, f_datanasc, f_filhos Filhos[]) RETURN boolean
>
> BEGIN
> INSERT INTO Clientes
> (
> nome,
> telefone,
> endereco,
> datanasc
> ) VALUES($1, $2, $3, $4);
>
> INSERT INTO Filhos
> (
> nome,
> idade,
> genitor,
> );
>
> RETURN TRUE;
>
> EXCEPTION
>
> WHEN NOT_NULL_VIOLATION THEN
> RAISE NOTICE 'Required filds are blank';
> RETURN FALSE;
> WHEN UNIQUE_VIOLATION THEN
> RAISE NOTICE 'One or more unique keys were violated';
> RETURN FALSE;
> WHEN RESTRICT_VIOLATION THEN
> RAISE NOTICE 'One or more restricts were violated';
> RETURN FALSE;
> END;
>
> Essa lógica daria certo? Tenho minha dúvidas pois não sei se quando o
> filho for cadastrado o genitor já terá sido incluído, caso contrário
> ocorreria uma violação de FK.
Ok, esqueci do unnest:
funcInsertCliente(f_nome varchar, f_telefone varchar, f_endereco
integer, f_datanasc, f_filhos Filhos[]) RETURN boolean
BEGIN
INSERT INTO Clientes
(
nome,
telefone,
endereco,
datanasc
) VALUES($1, $2, $3, $4);
INSERT INTO Filhos
(
nome,
idade,
genitor,
) SELECT * FROM unnest(f_filhos);
RETURN TRUE;
EXCEPTION
WHEN NOT_NULL_VIOLATION THEN
RAISE NOTICE 'Required filds are blank';
RETURN FALSE;
WHEN UNIQUE_VIOLATION THEN
RAISE NOTICE 'One or more unique keys were violated';
RETURN FALSE;
WHEN RESTRICT_VIOLATION THEN
RAISE NOTICE 'One or more restricts were violated';
RETURN FALSE;
END;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral