Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con un trigger

Estas en el tema de Problema con un trigger en el foro de SQL Server en Foros del Web. Hola buenas tardes a todos mi problemilla es el siguiente, tengo una tabla partidos la cual tiene PARITDOS ID_PARTIDOS NUM_JORNADA EQ_CASA EQ_FUERA RESULTADO Vale lo ...
  #1 (permalink)  
Antiguo 17/01/2013, 11:18
 
Fecha de Ingreso: noviembre-2010
Mensajes: 16
Antigüedad: 13 años, 5 meses
Puntos: 0
Problema con un trigger

Hola buenas tardes a todos mi problemilla es el siguiente, tengo una tabla partidos la cual tiene
PARITDOS
ID_PARTIDOS
NUM_JORNADA
EQ_CASA
EQ_FUERA
RESULTADO

Vale lo que quiero es que dependiento del resultado,que puede ser 1(gana eq_casa),2(gana eq_fuera) y x ... me actualize los puntos de la tabla equipos,dependiendo de quien haya ganado o si han empatado.

La tabla equipos tiene:

EQUIPOS
NOMBRE(PK)
CIUDAD
PUNTOS
DIVISION

He creado este disparador pero no me funciona:

CREATE OR REPLACE TRIGGER SUMA_PUNTOS
AFTER UPDATE ON PARTIDOS
DECLARE
V_EQ_CASA PARTIDOS.EQ_CASA%TYPE;
V_EQ_FUERA PARTIDOS.EQ_FUERA%TYPE;
V_RESULTADO PARTIDOS.RESULTADO%TYPE;
BEGIN
SELECT EQ_CASA,EQ_FUERA,RESULTADO
INTO V_EQ_CASA,V_EQ_FUERA,V_RESULTADO
FROM PARTIDOS;
IF V_RESULTADO=1 THEN
UPDATE EQUIPOS
SET PUNTOS=PUNTOS+3
WHERE V_EQ_CASA=EQUIPOS.NOMBRE;
END IF;
END;

Me faltaria el caso de resutlado=2 y de x pero voy por partes.
el trigger se me crea pero a la hora de actualizar me dice que le salen mas de dos valores, exactamente pone:
exact fetch returns more than requested number of rows
at nombre_trigger, line 6
error during execution of trigger nombre_trigger.

Pido consejo y ayuda porque no se como hacer esto, tambien he de decir que el nombre eq_casa y eq_fuera viene de la clave primaria de equipos (nombre), no se si por coger los nombres del mismo campo habra errores.
Gracias por todo, espero vuestras respuestas.
  #2 (permalink)  
Antiguo 17/01/2013, 11:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con un trigger

puedes manejar las tablas en este caso inserted o deleted, para saber cual es el id del partido que estas usando(o en su defecto los equipos que se enfrentaron), ahora falta saber como guardas el resultado, en la columna, si pones gano, perdio, empato, no se si lo tengas asi pero digamos que esta de este modo:

partido local visitante resultado
1 equipo1 equipo2 gana

cuando haces el update de esta tabla ya sabes que el que gano fue el equipo1 local ;) asi que al hacer el trigger quedaria algo asi:


Código SQL:
Ver original
  1. CREATE TRIGGER partidos after UPDATE ON partidos
  2. BEGIN
  3. DECLARE @resultado VARCHAR(20)
  4. DECLARE @LOCAL VARCHAR(20)
  5. DECLARE @visitante VARCHAR(20)
  6. SELECT @resultado=resultado FROM deleted
  7. SELECT @LOCAL=LOCAL FROM deleted
  8. SELECT @visitante=visitante FROM deleted
  9.  
  10. IF @resultado='gana' THEN
  11. UPDATE equipos SET puntos=puntos+3 WHERE nombre=@LOCAL
  12. IF @resultado='pierde' THEN
  13. UPDATE equipos SET puntos=puntos+3 WHERE nombre=@visitante
  14. IF @resultado='empata' THEN
  15. BEGIN
  16. UPDATE equipos SET puntos=puntos+1 WHERE nombre IN (@visitante,@LOCAL)
  17. END
  18.  
  19. END

espero te sirva de ayuda :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 17/01/2013, 14:36
 
Fecha de Ingreso: noviembre-2010
Mensajes: 16
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problema con un trigger

Gracias por tu respuesta, basicamente tengo mas o menos lo que as dicho lo unico que el resultado lo tengo como las quinielas 1,x ,2 he estado mirando lo que dices y he realizado este trigger:

Código:
CREATE OR REPLACE TRIGGER SUMA_PUNTOS
AFTER UPDATE ON PARTIDOS
DECLARE
V_local PARTIDOS.EQ_CASA%TYPE;
V_visitante PARTIDOS.EQ_FUERA%TYPE;
V_RESULTADO PARTIDOS.RESULTADO%TYPE;
BEGIN
SELECT EQ_CASA,EQ_FUERA,RESULTADO
INTO V_local,V_visitante,V_RESULTADO
FROM PARTIDOS; 
IF V_RESULTADO=1 THEN
 UPDATE EQUIPOS
 SET PUNTOS=PUNTOS+3
 WHERE NOMBRE=V_local;
END IF;
END;
/
Se crea sin problemas pero cuando actualizo el resultado de un partido me sale el error que comenté al principio:
exact fetch returns more than requested number of rows
at nombre_trigger, line 6
error during execution of trigger nombre_trigger.

Voy a ir primero a ver si consigo que vaya cuando gana el local y luego ire poniendole los otros casos porque sino no avanzo, gracias por todo espero haberme explicado medianamente bien.
  #4 (permalink)  
Antiguo 17/01/2013, 15:50
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con un trigger

el problema es este query:

SELECT EQ_CASA,EQ_FUERA,RESULTADO
INTO V_local,V_visitante,V_RESULTADO
FROM PARTIDOS

ya que aqui te trae todos los partidos, no nada mas uno, deberias de ponerle un where

SELECT EQ_CASA,EQ_FUERA,RESULTADO
INTO V_local,V_visitante,V_RESULTADO
FROM PARTIDOS where partido=id_partido

para eso usa las tablas deleted o inserted......en el ejemplo que te mando hago uso de estas tablas, el problema no es el update sino que la asignacion de valores que haces (V_local PARTIDOS.EQ_CASA%TYPE) quiere asignar mas de un valor a una variable.

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/01/2013, 07:20
 
Fecha de Ingreso: noviembre-2010
Mensajes: 16
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problema con un trigger

Cierto, tienes razon con lo de los valores, he pensao que me viene mejor hacerlo con un cursor ya que tengo que ir comprobando fila a fila y he hecho esto:

Código:
DECLARE
CURSOR suma_puntos IS
(SELECT EQ_CASA, EQ_FUERA, RESULTADO
 FROM PARTIDOS
 WHERE RESULTADO is not NULL);
v_local PARTIDOS.EQ_CASA%TYPE;
v_visitante PARTIDOS.EQ_FUERA%TYPE;
v_resultado PARTIDOS.RESULTADO%TYPE;
BEGIN
 OPEN suma_puntos;
 FETCH suma_puntos INTO v_local,v_visitante,v_resultado;
  WHILE suma_puntos%FOUND LOOP
   IF v_resultado=1 THEN
	UPDATE EQUIPOS
	SET PUNTOS=PUNTOS+3
	WHERE NOMBRE=v_local;
	END IF;
   FETCH suma_puntos INTO v_local,v_visitante,v_resultado;
  END LOOP;
 CLOSE suma_puntos;
END;
Si no entiendes algo del codigo pregunta. Con la select del cursor me aseguro que las filas que consulto tienen resultado.
Y despues pues con el if hago los diferentes puntos que se suman (aqui solo tengo cuando gana local)
El tema es que me da un fallo que no se que quiere decir te lo pongo:

Código:
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 13
Es algo del if pero no se que, a ver si me podeis echar una mano os lo agradezco de antemano, gracias.
  #6 (permalink)  
Antiguo 19/01/2013, 12:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con un trigger

y para que un cursor? con el trigger obtienes cual es el que tiene valor usando las tablas deleted o inserte(tablas del trigger)....ya si te quieres complicar ps como dicen Juan Gabriel "Hay Tu" jajajaja...


El error que te aparece es que estas haciendo un conversion no valida(usando un tipo char en una operacion int)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 21/01/2013, 09:41
 
Fecha de Ingreso: noviembre-2010
Mensajes: 16
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problema con un trigger

El tema es que no se como van esas tablas, porque yo en la tabla partidos tengo insertadas todas las jornadas pero no tengo los resultados de los partidos.
En realidad el problema es el que comentaste que yo no defino con un where los datos que tengo que recuperar lo que quiero es que me coja la fila que actualizo para que segun que resultado ponga me sume los puntos en la otra tabla de equipos.
No se como hacer esto ya me estoy volviendo loco, espero vuestras respuestas.
  #8 (permalink)  
Antiguo 21/01/2013, 09:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problema con un trigger

haz tu trigger, y en el codigo ponle

Código MySQL:
Ver original
  1. CREATE OR REPLACE TRIGGER SUMA_PUNTOS
  2. AFTER UPDATE ON PARTIDOS
  3.  
  4. select * from inserted
  5. select * from deleted

y asi ves como usar esas tablas y los valores que traen :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: select, tabla, trigger, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:14.