PDA

Ver la Versión Completa : Ejecutar cadena SQL desde un SP


waly2k1
26-07-2013, 07:10:03
Hola muchachos!
Tengo una cadena sql que se arma dinamicamente cuando selecciono unas opciones y ejecuto luego desde una consulta
no genera ningun error, tampoco actualiza nada. He probado desde tantas opciones, pero no obtuve resultado alguno
entonces decidí poner un execute dentro de un strored procedure que evalue la cadena que paso como parámetro,
pero tampoco me deja hacerlo, no es como en MS-SQL Server.
Así que pregunto, como sería esto desde un SP, o sea que reciba como parametro la consulta de actualización y luego
la ejecute. Y por qué puede ser que la consulta desde la aplicación no genere ningun resultado y tampoco genere error?
Saludos y cualquier ayuda me serviria de mucho, muchas gracias!

Paso acá un ejemplo de la consulta, ya que tampoco me actualiza desde una consola
UPDATE DB2ADMIN.PRODUCTO SET PRECIO_COSTO=PRECIO_COSTO* ( 1 + 10/100 );
Si pongo un precio de costo fijo sí lo hace, pero en este ejemplo que incremento un 10% no
Gracias!

olbeup
26-07-2013, 09:13:53
Hola waly2k1,

Es posible que el valor de PRECIO_COSTO este a NULL y por esta razón no te actualiza el precio, hay una función en SQL Server que es ISNULL(CAMPO, 0) esto quiere decir que si el CAMPO está a NULL se convierte a 0 (cero)

Valor del Campo:
PRECIO_COSTO(NULL) = PRECIO_COSTO(NULL) * (1 + (10/100)) = NULL

Un saludo.

waly2k1
26-07-2013, 10:47:13
No, el campo contiene valor. Suena logico si lo que decis, pero debería dejarme un valor nulo en todo caso.
Pero de hecho tengo un solo registro en la tabla, ya que estoy migrando recién la base desde MySQL a DB2.
El problema acá es que a DB2 no le gusta la expresión:
SET PRECIO_COSTO = PRECIO_COSTO * (1 + ( 10 /100))

Si en el codigo realizo algo como esto:

var
dPORC:double;

dPORC := txtPORC.Value / 100;
dPORC := 1 + dPORC;
y luego:
'PRECIO_COSTO=PRECIO_COSTO * ' + FloatToStr( dblPORC )

Así si funciona, por lo que veo es que no puedo pasar una expresion para que evalue, y en todos los SMDB que vi hasta ahora si lo soportan
En fin, mientras se pueda hacerlo de cualquier manera no importa, pero cuando me toque la parte de grandes cálculos, ej. IVA y demas, me
vuelvo loco con esto, ahí si que tendré que modificar muchas lineas de código, por algo que viene funcionando hace mucho con otros motores
de base de datos normalmente. Pero bueh, así se aprende (por lo menos a renegar más hehe)
Muchas gracias amigo por la ayuda, un abrazo!

ozsWizzard
26-07-2013, 12:45:17
No estoy seguro si en DB2, en otras bases de datos hay una función que hace que devuelva un valor específico en caso de nulo.

Ejemplo oracle y FireBird (Función NVL):

UPDATE DB2ADMIN.PRODUCTO SET PRECIO_COSTO = NVL(PRECIO_COSTO, 0) * ( 1 + 10/100 );


Ejemplo MS Sql Server (Función ISNULL)

UPDATE DB2ADMIN.PRODUCTO SET PRECIO_COSTO = ISNULL(PRECIO_COSTO, 0) * ( 1 + 10/100 );


Ejemplo MySql y creo que en DB2 (Función IFNULL)

UPDATE DB2ADMIN.PRODUCTO SET PRECIO_COSTO = IFNULL(PRECIO_COSTO, 0) * ( 1 + 10/100 );


Contrasta la sintaxis que no sé seguro que sea así

defcon1_es
29-07-2013, 12:02:32
Puntualizo: En Firebird no existe la funcion NVL (al menos de forma nativa), es COALESCE:
UPDATE DB2ADMIN.PRODUCTO SET PRECIO_COSTO = COALESCE(PRECIO_COSTO, 0) * ( 1 + 10/100 );

ozsWizzard
29-07-2013, 12:12:37
Tenía mal la chuleta, gracias por la corrección :)