Re: [pgbr-geral] Insert antes de raise exception
Em 24 de novembro de 2015 23:08, Danilo Silvaescreveu: > 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
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
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
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
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