Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fabiapo

[Resolvido] Problemas com commit

Recommended Posts

Pessoal,

 

Tenho a seguinte procedure:

 

CREATE OR REPLACE FUNCTION altera_senha (nom_login in text, novasenha in text, frase in text, id_user in integer) RETURNS void AS

$$

BEGIN

INSERT INTO usuario_historico (nm_login, sp_senha, id_usuario, dt_inclusao, hr_inclusao)

VALUES (nom_login, novasenha, id_user, current_date, current_time, id_user_inc);

 

UPDATE usuario_acesso set ds_frase = frase, sp_senha = novasenha

WHERE nm_login = nom_login and id_usuario = id_user;

COMMIT;

END;

$$

LANGUAGE 'plpgsql';

 

Porém, ao executá-la, aparece a seguinte mensagem:

ERRO: SPI_execute_plan failed executing query "COMMIT": SPI_ERROR_TRANSACTION

CONTEXTO: PL/pgSQL function "ffp_altera_senha" line 7 at SQL statement

 

Alguém sabe o porque dá erro no commit?

 

Se retirarmos o commit funciona perfeitamente porém, se der problemas no banco, perdemos todos os dados não commitados.

 

O que fazer?

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por default, o postgres é Auto-commit dentro de stored procedures. Você não precisa usar o COMMIT ao final da sotred procedure. Se a stored procedure foi executada com sucesso, os dados serão persistidos. Se der exeção, é dado rollback automaticamente.

 

Você pode usar commit quando você explicitamente inicia uma transação com o BEGIN, desde que seja na query do pgadmin ou similares. Você precisa usar o BEGIN para iniciar uma transação. Há também o SAVEPOINT (http://www.postgresql.org/docs/8.1/static/sql-savepoint.html), que salva a transação a partir dali, permitindo dar rollback até ela.

 

Acredito que dentro de uma store procedure você possa usar COMMIT desde que você a inicie com BEGIN em alguma parte do código. Mas acredito que você só precisa fazer isso em stored procedures muito grandes, já que essas pequenas como a sua pode-se deixar com o auto-commit (até pq você n deseja dar rollback dentro da stored procedure)

 

Consegui explicar legal? ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo,

 

Você conseguiu explicar legal sim. Obrigada!

 

Porém, irei aplicar o exception que você havia me explicado anteriormente nesta query.

 

Desta forma, terei que colocar o commit, tendo em vista que irei iniciar com BEGIN e EXCEPTION?

 

Obrigada!

 

 

 

Por default, o postgres é Auto-commit dentro de stored procedures. Você não precisa usar o COMMIT ao final da sotred procedure. Se a stored procedure foi executada com sucesso, os dados serão persistidos. Se der exeção, é dado rollback automaticamente.

 

Você pode usar commit quando você explicitamente inicia uma transação com o BEGIN, desde que seja na query do pgadmin ou similares. Você precisa usar o BEGIN para iniciar uma transação. Há também o SAVEPOINT (http://www.postgresql.org/docs/8.1/static/sql-savepoint.html), que salva a transação a partir dali, permitindo dar rollback até ela.

 

Acredito que dentro de uma store procedure você possa usar COMMIT desde que você a inicie com BEGIN em alguma parte do código. Mas acredito que você só precisa fazer isso em stored procedures muito grandes, já que essas pequenas como a sua pode-se deixar com o auto-commit (até pq você n deseja dar rollback dentro da stored procedure)

 

Consegui explicar legal? ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não será preciso usar commit.

 

Quando der exceção , você terá que fazer um novo insert ou update ou delete corrigindo o erro. Pois ao entrar no bloco de exceção ele já vai ter dado rollback.

 

Ex:

 

-- Tentando dar insert
insert into ....

exception
   when others then
	   -- outro insert tentando arrumar o primeiro
	   insert into ...

Normalmente, eu não recomendo fazer isso. O melhor é que, ao capturar uma exceção, você jogue pro usuário pedindo para corrigir, pois se der uma exceção dentro de outra exceção as coisas podem ficar bem feias...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo,

 

Muuuuuito obrigada mais uma vez.

 

 

 

 

Não será preciso usar commit.

 

Quando der exceção , você terá que fazer um novo insert ou update ou delete corrigindo o erro. Pois ao entrar no bloco de exceção ele já vai ter dado rollback.

 

Ex:

 

-- Tentando dar insert
insert into ....

exception
   when others then
	   -- outro insert tentando arrumar o primeiro
	   insert into ...

Normalmente, eu não recomendo fazer isso. O melhor é que, ao capturar uma exceção, você jogue pro usuário pedindo para corrigir, pois se der uma exceção dentro de outra exceção as coisas podem ficar bem feias...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.