Em 24 de julho de 2010 13:38, Vinicius Marconi Vasconcelos Berni
<[email protected]> escreveu:
> Pessoal, se tiver alguém por ai, segue meu problema.
>
> Tenho uma função, segue:
>
>
> DECLARE
>
>   ->  variaveis <-
>
> BEGIN
>     START TRANSACTION;
>
>     ->EXECUÇÃO<-
>
>
>     -- Commit na transacao
>     COMMIT;
>
>
>     return VARIAVEL RETORNO;
>
> EXCEPTION
>     WHEN NO_DATA_FOUND THEN
>         ROLLBACK;
>         RAISE EXCEPTION  ....
>
>     WHEN TOO_MANY_ROWS THEN
>        ROLLBACK;
>         RAISE EXCEPTION ...
>
>       .......
>
> END;
>
> ELA COMPILA NUMA BOA PORÉM NÃO FUNCIONA DE JEITO NENHUM.
>
> ERRO: SPI_execute_plan failed executing query "START TRANSACTION":
> SPI_ERROR_TRANSACTION
>

Você não precisa abrir uma transação dentro de uma função do tipo
"stored procedure", tampouco dentro de um TRIGGER ou de uma função
convencional.

Quem faz o controle de BEGIN, COMMIT e ROLLBACK é a conexão (a
aplicação) que faz a chamada às funções e outros comandos SQL, para
garantir a atomicidade em transações caso ocorra algum erro.

A solução no seu caso é remover o START TRANSACTION de dentro da
função - mesmo fora dela ele não é necessário [1] - apenas o COMMIT ou
ROLLBACK. Verifique também se sua aplicação não está com o AUTOCOMMIT
ativado, caso contrário ROLLBACK não irá funcionar...

Apenas para lembrar: comandos SQL executados pelo pgAdmin são AUTOCOMMIT.

[1] http://pgdocptbr.sourceforge.net/pg82/sql-start-transaction.html
-- 
TIAGO J. ADAMI
http://www.adamiworks.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a