Re: [pgbr-geral] Insert antes de raise exception

2015-11-25 Por tôpico Rafael Fialho
Em 24 de novembro de 2015 23:08, Danilo Silva 
escreveu:

> ​Fiz um teste conforme indicado, mas a dúvida pairou sobre o RETURN pois
> como é para trigger, então o return da chamada da função​
>
> ​é um TRIGGER​, então minha função ficou assim:
>
> EXCEPTION WHEN OTHERS THEN
> INSERT INTO tabela_log...;
> RETURN NULL;
> END;
>
> Até aqui beleza, mas a questão é que preciso mostrar a exceção na tela
> da aplicação, pois do jeito que fiz e mostrei aqui, quando faço o insert, a
> aplicação entende que a instrução deu certo (apesar de retornar 0 linhas
> afetadas, porém sem erros).
>

Uma alternativa é usar o raise notice (exemplo em [1]), antes ou depois de
realizar o insert, e tratar as mensagens no seu driver de conexão, é o que
faço em alguns casos.

[1] - http://www.postgresql.org/docs/current/static/plpgsql-structure.html

[]'s
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Insert antes de raise exception

2015-11-25 Por tôpico Dickson S. Guedes
On Tue, Nov 24, 2015 at 11:08:29PM -0200, Danilo Silva wrote:
>
> Fiz um teste conforme indicado, mas a dúvida pairou sobre o RETURN pois
> como é para trigger, então o return da chamada da função
> 
> é um TRIGGER, então minha função ficou assim:
> EXCEPTION WHEN OTHERS THEN
> INSERT INTO tabela_log...;
> RETURN NULL;
> END;
> 
> Até aqui beleza, mas a questão é que preciso mostrar a exceção na tela
> da aplicação, pois do jeito que fiz e mostrei aqui, quando faço o insert, a
> aplicação entende que a instrução deu certo (apesar de retornar 0 linhas
> afetadas, porém sem erros).

Apenas uma nota, este é um exemplo de caso de uso para as Autonomous
transactions [1] e [2].

[1] https://wiki.postgresql.org/wiki/Autonomous_subtransactions
[2] https://wiki.postgresql.org/wiki/AutonomousTransactionsUnconference2015

[]s
Guedes
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Insert antes de raise exception

2015-11-24 Por tôpico Flavio Henrique Araque Gurgel

Pessoal,

Dentro de uma função que retorna uma trigger, é possível efetuar um
insert antes de um raise exception?

Por exemplo

IF condicao THEN
INSERT tabela_log...
RAISE EXCEPTION '';
RETURN NULL;
END IF;
RETURN NEW;

A intenção é gravar em uma tabela de log a tentativa de insert.


Quando você faz o RAISE EXCEPTION o que você faz é justamente... uma 
exceção. Logo, um rollback é feito obrigatoriamente.


Para fazer o que você quer, tem que tratar a exceção, um bloco assim no 
fim da função pode te ajudar:

EXCEPTION
WHEN unique_violation THEN
INSERT INTO tabela_log... ;
RETURN outro_valor;
END;

Lembre-se de tratar seu RETURN na chamada da função, porque você *não* 
terá tratamento do rollback de outros comandos numa mesma transação, 
neste caso.


[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Insert antes de raise exception

2015-11-24 Por tôpico Danilo Silva
Pessoal,

Dentro de uma função que retorna uma trigger, é possível efetuar um insert
antes de um raise exception?

Por exemplo

IF condicao THEN
INSERT tabela_log...
RAISE EXCEPTION '';
RETURN NULL;
END IF;
RETURN NEW;

A intenção é gravar em uma tabela de log a tentativa de insert.

[]s
Danilo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Insert antes de raise exception

2015-11-24 Por tôpico Danilo Silva
Em 24 de novembro de 2015 11:50, Flavio Henrique Araque Gurgel <
fha...@gmail.com> escreveu:

> Pessoal,
>>
>> Dentro de uma função que retorna uma trigger, é possível efetuar um
>> insert antes de um raise exception?
>>
>> Por exemplo
>>
>> IF condicao THEN
>> INSERT tabela_log...
>> RAISE EXCEPTION '';
>> RETURN NULL;
>> END IF;
>> RETURN NEW;
>>
>> A intenção é gravar em uma tabela de log a tentativa de insert.
>>
>
> Quando você faz o RAISE EXCEPTION o que você faz é justamente... uma
> exceção. Logo, um rollback é feito obrigatoriamente.
>
> Para fazer o que você quer, tem que tratar a exceção, um bloco assim no
> fim da função pode te ajudar:
> EXCEPTION
> WHEN unique_violation THEN
> INSERT INTO tabela_log... ;
> RETURN outro_valor;
> END;
>
> Lembre-se de tratar seu RETURN na chamada da função, porque você *não*
> terá tratamento do rollback de outros comandos numa mesma transação, neste
> caso.
>
> ​Legal Flavio, vou testar, obrigado.

[]s
Danilo​
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral