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

Ayuda! Hacer UPDATE con "if's"

Estas en el tema de Ayuda! Hacer UPDATE con "if's" en el foro de Oracle en Foros del Web. Quiero realizar unos updates de una tabla a partir de otra segunda tabla, que contiene unos campos con datos nuevos a actualizar de la primera. ...
  #1 (permalink)  
Antiguo 08/06/2007, 04:25
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Ayuda! Hacer UPDATE con "if's"

Quiero realizar unos updates de una tabla a partir de otra segunda tabla, que contiene unos campos con datos nuevos a actualizar de la primera.

Por ejemplo, TABLA1 tiene las columnas 1, 2, 3, 4 y 5, y TABLA2 las columnas 1, 2, y 5.

Quiero realizar una actualización total de la TABLA1 a partir de todos los registros de la TABLA2, el problema está en que si algún campo de la TABLA2 es nulo, no quiero actualizarlo (quiero dejar el valor que hubiera en TABLA1).

¿Cómo realizo esto (desde PL-SQL)?

Opciones:

Podría o bien ir haciendo "IF IS NULL" con cada campo, y haciendo un update por cada campo (lo cual tiene de malo que sería bastante lento, pues haría un update por columna, y por registro), o de algún modo realizar un único update por registro leído de la tabla2; pero para eso, ¿cómo discrimino cuándo hacer update de un campo y cuándo no (o si lo realizo, que sea para dejar el valor anterior)? ¿Puedo meter el "if" dentro del update, o si no, puedo crear una cadena de texto que contenga la sentencia UPDATE y que sea la que luego ejecute?

Es decir:

¿Puedo hacer esto?
UPDATE TABLA1 SET CAMPO1=(IF TABLA2.CAMPO2 IS NULL ... ELSE...)

¿Puedo hacer esto?

str='UPATE SET'+... (construir la sentencia).
str+=...
Execute(str)

¿Puedo hacer otra cosa que no conozca y no haya dicho?
  #2 (permalink)  
Antiguo 08/06/2007, 04:34
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Re: Ayuda! Hacer UPDATE con "if's"

Lo que sí he visto que se puede hacer, es meter un "select" en el SET de un update así:

UPDATE TABLA SET campo1=(select...)

Tal vez a través de ese select, podría seleccionar o un valor u otro dependiendo de si es nulo o no el de la tabla2.
  #3 (permalink)  
Antiguo 08/06/2007, 07:44
(Desactivado)
 
Fecha de Ingreso: junio-2007
Mensajes: 14
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: Ayuda! Hacer UPDATE con "if's"

Bajo ciertas condiciones, podes usar un join updateable, que para gran cantidad de registros es lo mas performante.

t1(c1,c2)
t2(c1 primary key,c3)

Actualizo t1.c2 con los valores de t2.c3.

UPDATE (SELECT a.c1,c2,c3
FROM t1 a,t2 b
WHERE a.c1 = b.c1)
SET c2 = c3;
  #4 (permalink)  
Antiguo 08/06/2007, 09:10
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Re: Ayuda! Hacer UPDATE con "if's"

Cita:
Iniciado por analfa Ver Mensaje
Bajo ciertas condiciones, podes usar un join updateable, que para gran cantidad de registros es lo mas performante.

t1(c1,c2)
t2(c1 primary key,c3)

Actualizo t1.c2 con los valores de t2.c3.

UPDATE (SELECT a.c1,c2,c3
FROM t1 a,t2 b
WHERE a.c1 = b.c1)
SET c2 = c3;
Gracias, pero sigue faltándome la parte del "if is null-->don't update".

Creo que lo mejor será hacer selects antes de las dos tablas, y en unas variables poner los valores a introducir, de forma tal que el update pone los valores que vengan en esas variables (que será o el valor nuevo, o el valor antiguo).

Es decir, en la parte en la que has puesto c2=c3, poner (o hacer lo necesario para que sea así) c2=c3 si c3 <> null, si no, c2=c2 (no se modifica).

Última edición por programadornet; 08/06/2007 a las 09:24
  #5 (permalink)  
Antiguo 08/06/2007, 09:29
(Desactivado)
 
Fecha de Ingreso: junio-2007
Mensajes: 14
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: Ayuda! Hacer UPDATE con "if's"

set c2 = nvl(c3,c2)
  #6 (permalink)  
Antiguo 11/06/2007, 05:20
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Re: Ayuda! Hacer UPDATE con "if's"

¡Gracias! ¡Muy útil! Aunque ya lo había hecho con "if's" y un update por registro, y funciona, ésa es probablemente la mejor forma para ahorrar líneas de código, por lo que voy a adaptarlo a ella.
  #7 (permalink)  
Antiguo 12/06/2007, 11:31
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años
Puntos: 1
Re: Ayuda! Hacer UPDATE con "if's"

Bueno, os informo de que ese método no funciona, pues arroja el error: ORA-01779: no se puede modificar una columna que se corresponde con una tabla no reservada por clave.

He buscado sobre el mismo, y mientras que en un sitio dicen que "hagas el update directamente" (y te vienen a decir que te olvides de lo que estabas haciendo, el UPDATE con JOIN's), http://www.techonthenet.com/oracle/errors/ora01779.php, en otro, http://www.programacion.com/bbdd/foros/34/msg/260780/ , la persona lo resuelve (pero sin saber por qué funciona así) añadiendo una clave UNIQUE a una tabla.

En resumidas cuentas, un rollo (interesante, pero lleno de complicaciones, y si el tiempo apremia...) voy a pasar de ese método y utilizar otro que ya me había funcionado.
  #8 (permalink)  
Antiguo 13/06/2007, 11:59
(Desactivado)
 
Fecha de Ingreso: junio-2007
Mensajes: 14
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: Ayuda! Hacer UPDATE con "if's"

Si te fijas en el ejemplo que puse, t1 tiene una pk sobre c1, por eso escribi que bajo ciertas condiciones se puede updatear el join, y esas condiciones significan que la tabla sea key-preserved, es decir que si c1 es pk de t, despues de hacer join, c siga siendo pk del join. Cual es el motivo de esto ? Que para updatear cada registro de t1 necesito una correspondencia unica con un registro de t2, para poder determinar de manera univoca el valor.
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 10:22.