On 09-11-2016 11:12, Matheus Saraiva wrote:
> Em 09/11/2016 12:02, Matheus Saraiva escreveu:
>> Tenho uma função que faz insert em uma tabela. Essa tabela tem duas
>> colunas que são únicas 'email' e 'login'.
>> Sendo assim uma exceção do tipo UNIQUE_VIOLATION code: 23505 pode
>> acontecer se for tentado inserir dados repetidos em qualquer uma
>> dessas duas colunas.
>> Pergunta. Como faço para capturar qual das duas colunas foram
>> violadas, tipo para retornar o nome dela, ou fazer algum procedimento
>> na mesma?
> 
Não há captura de colunas (a não ser que queira analisar a mensagem de
erro) apesar de ser uma possível informação a ser capturada porque
restrições pode usar múltiplas colunas ou mesmo estar em expressões.

> Uma pequena correção. Na verdade quero capturar qual das unique keys
> foram violadas, sendo que cada coluna citada tem sua unique key. Em
> alguns casos (outras tabelas) uma unique key é composta por mais de uma
> coluna.
>
Basta usar GET STACKED DIAGNOSTICS. Você não informou a versão (porque
ninguém informa a versão?); a cláusula acima só funciona a partir do
9.2. Veja:

create table foo (a int not null, b int not null, unique(a), unique(b));
insert into foo (a,b) values(1,1);
insert into foo (a,b) values(2,2);
create function ffoo(x integer, y integer) returns void as $$
declare
        tabela text;
        restricao text;
begin
insert into foo (a,b) values(x,y);
exception when unique_violation then
        get stacked diagnostics tabela = TABLE_NAME,
                                restricao = CONSTRAINT_NAME;
        raise notice 'tabela: % ; constraint: %', tabela, restricao;
end;
$$ language plpgsql;
select ffoo(2,3);
select ffoo(5,1);


-- 
   Euler Taveira                   Timbira - http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a