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
