Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2008
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
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, EBE, :HABER
  do begin
     if (NOT EBE IS NULL) then TMP_SALDO = :TMP_SALDO - EBE;
     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.
Responder Con Cita
  #2  
Antiguo 22-03-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Store procedure sancarlos MySQL 3 30-01-2008 19:51:49
Store Procedure sépoco MS SQL Server 5 10-01-2008 16:11:54
Store procedure php jorgito MySQL 1 06-06-2006 08:55:12
Store Procedure en Delphi carlomagno Firebird e Interbase 5 21-09-2005 20:24:22
store procedure ronimaxh Firebird e Interbase 2 24-06-2003 20:20:22


La franja horaria es GMT +2. Ahora son las 00:26:32.


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
Copyright 1996-2007 Club Delphi