Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Transaciones en Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=67804)

molusco 07-05-2010 06:20:35

Transaciones en Stored Procedure
 
Hola amigos.

Estoy empezando el mundo delphi 7 y con base de datos sql2000

Tengo una tabla donde dos columnas de ellas forma un index unico: (serie, numero)

He creado la siguiente SP, para hacer una pruebas.


Código SQL [-]
CREATE PROCEDURE insert_tab
AS
BEGIN
--SET XACT_ABORT ON 
begin TRANSACTION
INSERT INTO dbo.aa_prueba ( serie, numero ) VALUES ( 1, 129 )
if @@error > 0 begin
--print 'bad insert...'
RAISERROR ('Bad insert....',16,1)
rollback TRANSACTION
return -1
END
else begin
print 'Good insert...'
commit TRANSACTION
return 0
end;
END

Por ahora estoy ejecutando el SP con el EMS-SQL
- Cuando ejecuto la primera vez - es todo correcto, incluyendo el mensaje 'Good insert...'
- Cuando doy por una segunda vez ( se sabe que ya existe ese registro ), no me imprime el error 'Bad Insert'...

Pero me emite un error en el mismo EMS-SQL asi:
Infracción de la restricción UNIQUE KEY 'aa_prueba_uq'. No se puede insertar una clave duplicada en el objeto 'aa_prueba'.
Se terminó la instrucción.

El error emitido por el EMS-SQL (que debo suponer que el sql le informa) es correcto... pero necesito que mi stored haga otro tipo de tareas despues del mensaje 'bad error'

Me ayudan?

Molusco

olbeup 07-05-2010 19:32:51

Quizás éste código te resulte más cómodo
Código SQL [-]
CREATE PROCEDURE dbo.insert_tab(@serie int, @numero int)
AS
BEGIN
  DECLARE
    @existe bit

  SET @existe = 
        (SELECT 
            COUNT(*) 
          FROM aa_prueba 
          WHERE SERIE = @serie 
                AND NUMERO = @numero)
  
  IF (@existe = 0)
  BEGIN
    BEGIN TRANSACTION
    INSERT INTO aa_prueba (SERIE, NUMERO) VALUES (@serie, @numero)    
    PRINT 'Good Insert....'
    COMMIT TRANSACTION
    RETURN 0
  END
  ELSE BEGIN
    RAISERROR('Bad insert....', 16, 1)
    RETURN -1
  END
END
Un saludo.


La franja horaria es GMT +2. Ahora son las 08:56:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi