Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Store Procedure con DeadLock (https://www.clubdelphi.com/foros/showthread.php?t=54536)

brandolin 22-03-2008 04:54:12

Store Procedure con DeadLock
 
Hola a todos, tengo el siguiente store procedure

Código SQL [-]
CREATE PROCEDURE CALC_CUENTACORRIENTE (
    PCOD_CLIENTE INTEGER)
AS
DECLARE VARIABLE HABER FLOAT;
DECLARE VARIABLE DEBE FLOAT;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TMP_SALDO FLOAT = 0;
begin
  TMP_SALDO = 0;
  for select ID, DEBE, HABER from CLIENTES_CUENTA
      where COD_CLIENTE =:PCOD_CLIENTE into :ID, :DEBE, :HABER
  do begin
     if (NOT :DEBE IS NULL) then TMP_SALDO = :TMP_SALDO - :DEBE;
     if (NOT :HABER IS NULL) then TMP_SALDO = :TMP_SALDO + :HABER;     
      UPDATE clientes_cuenta SET SALDO=:TMP_SALDO WHERE ID = :ID;      
  end
end

Basicamente lo que hace es recorrer una tabla de cuenta corriente e ir calculando los saldos parciales de cada uno de los registros. El problema sirge luego de hacer un update el proximo da error de DeadLock.
Alguien sabe lo que esta pasando ? Habra alguna otra forma de hacerlo ?

Gracias desde ya.

Lepe 22-03-2008 12:47:57

Pues yo lo veo como un trigger before update e insert. Así no tienes que llamarlo nunca. y como es un trigger "before" sobre la misma tabla y registro, nunca tendrías abrazos mortales.

Ventajas:
- No tienes que arrancar manualmente el proceso por cada cliente. (se hace en automático al insertar/modificar un registro en CLIENTES_CUENTA).

- Como solo actúa sobre una tabla y registro, es imposible que haya un deadlock

- Es muy simple el trigger:
Código SQL [-]
     if (NOT new.DEBE IS NULL) then TMP_SALDO = :TMP_SALDO - new.DEBE;
     if (NOT new.HABER IS NULL) then TMP_SALDO = :TMP_SALDO + new.HABER;     
 SALDO= :TMP_SALDO
(más o menos)


Saludos


La franja horaria es GMT +2. Ahora son las 11:39:13.

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