Em 09/11/2016 13:15, Euler Taveira escreveu:
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);
A versão é 9.5.
É exatamente isso obrigado.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral