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

Problema con update (hay una funcion en el where)

Estas en el tema de Problema con update (hay una funcion en el where) en el foro de Oracle en Foros del Web. Hola a todos, Tengo un problema con una sentencia update, que es la siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original UPDATE TB_TABLA tabla     ...
  #1 (permalink)  
Antiguo 28/03/2013, 09:20
 
Fecha de Ingreso: julio-2008
Mensajes: 21
Antigüedad: 16 años, 4 meses
Puntos: 0
Problema con update (hay una funcion en el where)

Hola a todos,
Tengo un problema con una sentencia update, que es la siguiente:

Código SQL:
Ver original
  1. UPDATE TB_TABLA tabla
  2.    SET visible = 0
  3.        WHERE  96506 = funcion_get_estado (tabla.id);


Este update me actualiza 0 rows, pero realmente si hago:
Código SQL:
Ver original
  1. SELECT * TB_TABLA tabla WHERE 96506 = funcion_get_estado (tabla.id);

si me encuentra registros.

He intentado poner la condición dentro de un IN, pero me sigue updateando 0 rows...

Alguna idea?
Muchas gracias!

Última edición por gnzsoloyo; 03/05/2013 a las 17:08 Razón: SQL no etiquetado
  #2 (permalink)  
Antiguo 28/03/2013, 10:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con update (hay una funcion en el where)

¿Y cómo es el código contenido en esa función?

Ten en cuenta que es perfectamente posible que puedas consultar una tabla, pero no hacer un UPDATE sobre ella si se genera algún conflicto respecto al estado de lectura/escritura... Sin ver el codigo de la función es difícil decirlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/04/2013, 02:40
 
Fecha de Ingreso: julio-2008
Mensajes: 21
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Problema con update (hay una funcion en el where)

el código de la función es el siguiente:


Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION NATINVERSIO_U.FN_HB_GET_FASE_HU(pActuacioId IN NUMBER)
  2.            RETURN  NUMBER
  3. AS
  4.   retorn        NUMBER(10);
  5. BEGIN
  6.  
  7.  SELECT CASE
  8.           WHEN SYSDATE > pl.data_inici_fase_5 AND SYSDATE < pl.data_fi_fase_5
  9.              THEN 96505
  10.           WHEN SYSDATE > pl.data_inici_fase_5
  11.              THEN 96506
  12.           WHEN SYSDATE > pl.data_inici_fase_4
  13.              THEN 96504
  14.           WHEN SYSDATE > pl.data_inici_fase_3
  15.              THEN 96503
  16.           WHEN SYSDATE > pl.data_inici_fase_2
  17.              THEN 96502
  18.           WHEN SYSDATE > pl.data_inici_fase_1
  19.              THEN 96501
  20.           ELSE NULL
  21.        END AS fase_id INTO retorn
  22.   FROM TABLA tabla INNER JOIN PLANIFICACION pl
  23.        ON pl.ID = act.ID
  24.  WHERE tabla.ID = pActuacioId;
  25.  
  26.  
  27.   RETURN retorn;
  28. EXCEPTION WHEN OTHERS THEN
  29.     RETURN NULL;
  30. END FN_HB_GET_FASE_HU;
  31. /

Última edición por gnzsoloyo; 03/05/2013 a las 17:09 Razón: SQL no etiquetado
  #4 (permalink)  
Antiguo 03/05/2013, 16:08
Avatar de zarwar  
Fecha de Ingreso: mayo-2013
Ubicación: Madrid
Mensajes: 77
Antigüedad: 11 años, 6 meses
Puntos: 4
Respuesta: Problema con update (hay una funcion en el where)

Como dice gnzsoloyo, debe estar generandose un conflictoy no te saltará la excepción del error porque la tienes capturada con el "When Others" en la función. Prueba a quitar la captura de la excepción a ver que error te lanza.

Como alternativas estaría poner la query de la función en el update o usar una tabla temporal.

Otra cosa, que te ocurrira es que por utilizar una función, probablemente no te entre por ningún índice al hacer el update.
__________________
Entra en mi blog sobre base de datos Oracle:
http://mundodb.es
  #5 (permalink)  
Antiguo 03/05/2013, 17:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con update (hay una funcion en el where)

Recién la veo a la SF que posteaste, @lastunikorn, y la verdad, es absurda...

¿Tienes claro que SYSDATE devuvelve la hora actual del servidor, no?
Eso implica que a menos que esos pl.data_inici_fase_X almacenen una fecha posterior a la del sistema al momento de la ejecución, jamás obtendrás un resultado coherente.
Además, como si fuera poco, hay al menos una condición completamente imposible:
Código SQL:
Ver original
  1. SYSDATE > pl.data_inici_fase_5 AND SYSDATE < pl.data_fi_fase_5
Un valor no puede ser mayor y menor que otro al mismo tiempo. Eso no es lógico.
En esas condiciones, el valor 96505 jamás será devuelto.

Creo que deberías revisar la lógica de esa función, y además sería interesante ver una muestra de registros de la tabla, para verificar que no estés solapando rangos, ya que no estás planteando una selección excluyente, sino una cadena preseleccionada de opciones, que bien podrías resolver con DECODE(), en lugar de usar eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: funcion, funciones, plsql, update
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 05:11.