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.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a