update con decode ?????

Carlos
24 de Septiembre del 2003
Hola a todos. Mi problema es el siguiente (entre otros muchos, que no vienen ahora al caso):
Necesito hacer un update de un campo de una tabla. El rollo está en que el cambo a modificar varia según un determinado parámetro. Le tengo puesto un decode en el set del update, pero parece que no le gusta (No se si esto se puede hacer, pero es lo único que se me ocurre). El tipo de sentencia que uso es esta:

update tabla
set decode (:parameter.parametro, 1, codigo1,
2, codigo2, 3, codigo3) = valor ;

Si tenéis alguna sugerencia, no dudéis.

Gracias anticipadas.

Connall
24 de Septiembre del 2003
Uhmmm... lo tienes al reves... es asi

update tabla set
codigo1 = decode(parametro, 1, valor, codigo1),
codigo2 = decode(parametro, 2, valor, codigo2),
codigo3 = decode(parametro, 3, valor, codigo3);

Carlos
24 de Septiembre del 2003
Lo mejor es utilizar sql dimanico.
En un if le preguntas por el parametro y metes toda la sentencia en una cadena, con el campo correspondiente que quieres actualizar.
Despues simplemente utiliza el DBMS_SQL y ejecuta esa cadena que has montado.
Salu 2

paola
24 de Septiembre del 2003
Supongo que definitivamente debes estar usando PL/SQL pues sino de donde sacarias "valor". Estoy en lo correcto? Si es así y estas en la versión 9i ya puedes usar el If:

BEGIN
IF valor='xxxxx'
UPDATE tabla SET......
ELSE
IF valor='zzzz'
UPDATE tabla SET.....
END IF;
END;

Paola
24 de Septiembre del 2003
Me olvide de ponerle el THEN.. al ejemplo:

IF .. THEN..... END IF

y ademas si deseas puedes usar el:

IF <condition1> THEN
<statements1>
ELSIF <condition2> THEN
<statements2>
ELSIF <conditionN> THEN
<statementsN>
END IF;

Espero que te ayude

sergok
24 de Septiembre del 2003
Desconozco si puedes hacerlo en una sola consulta pero siempre la podrás dividir:
update tabla set codigo1 = valor where parametro = 1;
update tabla set codigo2 = valor where parametro = 2;
update tabla set codigo3 = valor where parametro = 3;
Si estas empleando PL podrías hacerlo con SQL dinámico.
Espero te ayude.