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

Responder a