Ir para conteúdo

POWERED BY:

Arquivado

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

GuilhermeTI

transacao em procedure

Recommended Posts

pessoal eu fiz uma procedure e eu queria ver se tudo estivesse correto ela daria um COMMIT mas se uma 1 dos IF estivesse errado ele daria um rollback mas o ELSE nao aceita um COMMIT antes oque eu faço ???

 

CREATE PROCEDURE GUI 
AS BEGIN 
BEGIN TRANSACTION
	IF (SELECT COUNT(*) FROM CLIENTES) > 600
	INSERT INTO MILTON VALUES (1)
			IF (SELECT MAX(COD) FROM MILTON) = 1  
			INSERT INTO MILTON VALUES (2)
			
				IF (SELECT MAX(COD) FROM MILTON) = 2 
				INSERT INTO MILTON VALUES (3)
				COMMIT
				ELSE 			
				ROLLBACK

END

Compartilhar este post


Link para o post
Compartilhar em outros sites

GuilhermeTI

 

você pode identificar a existência de erro(s) na sua procedure através da variável @@error. você escreve o código e após uma operação (insert, update, etc) você verifica se a variável é diferente de 0, se for você executa o rollback, senão você executa o commit.

 

A partir do SQL Server 2005 existe uma nova funcionalidade conhecida como TRY CATCH.

 

Veja no BOL ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/248df62a-7334-4bca-8262-235a28f4b07f.htm

 

[]'s

 

Fernando Silveira

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa cara obrigado por me falar isso mas eu ja conheco a variavel @@error e o begin try begin catch para tratar erros mas eu oque eu quero tratar nao é um ERRO que o sql server gera mas sim um erro logico que para o sql server ta normal mas pra mim nao entendeu ?? entao me ajudem !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

GuilhermeTI,

 

kal eh a logica que você ker utilizar neste seu exemplo????

 

Abçs

 

 

vamos la

 

é um exemplo bem simple sobre ATOMICIDADE

primeiro

 

Se o total de clientes for maior que 600

vai ocorrer uma insercao na tabela milton com o valor 1

Se o valor maximo da tabela milton for 1

vai ocorrer outra insercao na tabel milton com o valor 2

Se o valor maximo da tabela milton for 2

vai ocorrer outra insercao na tabel milton com o valor 3

 

eu seja se o numero de clientes for maior que 600 entao eu quero que seja inserido 1,2,3

e nao apena 1,2 ou 2,3 entendeu???

 

se uma insercao nao der cento entao da um roll back um tudo caso contrario commit

Compartilhar este post


Link para o post
Compartilhar em outros sites

ve se isso te ajuda:

set nocount on

create table #tabela1 (valor int)

declare @valor int, @valor_maximo int
set @valor = 600

select @valor_maximo = max(valor) from #tabela1

	begin transaction 
/* Se o total de clientes for maior que 600
vai ocorrer uma insercao na tabela milton com o valor 1 */
if @valor > 600 
	begin	
	insert into #tabela1 values (1)
/* Se o valor maximo da tabela milton for 1 
vai ocorrer outra insercao na tabel milton com o valor 2 */
	if (select max(valor) from #tabela1) = 1
	insert into #tabela1 values (2)
/* Se o valor maximo da tabela milton for 2 
vai ocorrer outra insercao na tabel milton com o valor 3 */
	if (select max(valor) from #tabela1) = 2
	insert into #tabela1 values (3)

end	

else print 'VALORES NAO ESTAO DE ACORDO'
	

select * from #tabela1
drop table #tabela1

Eu acho que era isso....

você pode usar uma instrucao de rollback com o goto e loop entre os IFS...

Compartilhar este post


Link para o post
Compartilhar em outros sites

um exemplo com o GOTO que retirei do book online...

begin transaction

set nocount on

table_loop:
rollback

create table #tabela1 (valor int)

declare @valor int, @valor_maximo int
set @valor = 600

select @valor_maximo = max(valor) from #tabela1

	begin transaction 
/* Se o total de clientes for maior que 600
vai ocorrer uma insercao na tabela milton com o valor 1 */
if @valor > 600 
	begin	
	insert into #tabela1 values (1)

	if (@@error) = 0 
		begin 	
		 commit
		end
	else 
	 goto table_loop

/* Se o valor maximo da tabela milton for 1 
vai ocorrer outra insercao na tabel milton com o valor 2 */
	if (select max(valor) from #tabela1) = 1
	insert into #tabela1 values (2)
/* Se o valor maximo da tabela milton for 2 
vai ocorrer outra insercao na tabel milton com o valor 3 */
	if (select max(valor) from #tabela1) = 2
	insert into #tabela1 values (3)

end	

else 

print 'VALORES NAO ESTAO DE ACORDO'
	

select * from #tabela1
drop table #tabela1

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.