Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Warning: Setting user variables within expressions is deprecated (https://www.clubdelphi.com/foros/showthread.php?t=96224)

adrall 12-05-2023 17:33:53

Warning: Setting user variables within expressions is deprecated
 
Hola buenas,

Utilizo el siguiente código para extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL y arrastro el saldo mediante la variable @isaldo, lo cual me funciona perfectamente.

Código SQL [-]
SET @isaldo:=0; 
SELECT *, @isaldo:=ROUND(@isaldo+entrada-salida,2) AS saldo FROM datos ORDER BY fecha_valor;

Sin embargo ahora MySQL me devuelve el siguiente mensaje de aviso:

Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. SQL.sql 1 17


Sabeis como podria actualizar este código para evitar problemas en futuras versiones de la BD.

Actualmente utilizo la version MySQL 8.0.30

Gracias y saludos.

delphi.com.ar 12-05-2023 21:43:11

Te lo está diciendo en el warning, en lugar de usar
Código SQL [-]
SELECT @isaldo:=ROUND(@isaldo+entrada-salida,2)....
debes usar
Código SQL [-]
SELECT ROUND(@isaldo+entrada-salida,2) INTO @isaldo....

Saludos

adrall 14-05-2023 20:07:41

Código SQL [-]
SELECT @isaldo:=ROUND(@isaldo+entrada-salida,2)....

Código SQL [-]
SELECT ROUND(@isaldo+entrada-salida,2) INTO @isaldo....


Si, ya entiendo lo que dice el Warning pero como se desarrolla? porque así tal cual no funciona ya que ahí no se indica de que tabla se extraen entrada o salida etc.

Casimiro Notevi 15-05-2023 10:19:13

Código SQL [-]
select campo from tabla into variable

adrall 15-05-2023 13:05:24

Cita:

Empezado por Casimiro Notevi (Mensaje 551461)
Código SQL [-]
select campo from tabla into variable

Esto devuelve error: Result consisted of more than one row

@isaldo debea tener un valor diferente, el saldo de la cuenta, en cada fila tal como devuelve el codigo que uso ahora y que lanza el Warning y esto es lo que no sé implementar con SELECT ... INTO ....

Gracias

adrall 15-05-2023 13:26:51

Stack overflow nos da la solución tanto en MariaDB como en Mysql 8.0:

https://dbfiddle.uk/v7D9TniE

Casimiro Notevi 15-05-2023 13:58:28

Entonces no has hecho la pregunta correcta, porque ese enlace no habla nada de almacenar valor en variable.

delphi.com.ar 15-05-2023 18:12:23

Cita:

Empezado por adrall (Mensaje 551462)
Esto devuelve error: Result consisted of more than one row

Nunca usé esa sintaxis, pero según entiendo deberías tener el mismo error con la sintaxis anterior.
En resumen, si quieres asignar una variable desde una consulta, el resultado debe ser de una fila. Alternativamente deberías usar cursores, para ir recorriendo el resultado y aplicando tu lógica a cada registro.


Cita:

Empezado por adrall (Mensaje 551464)
Stack overflow nos da la solución tanto en MariaDB como en Mysql 8.0:

https://dbfiddle.uk/v7D9TniE

Esto es radicalmente otra cosa, restarle a un campo el resultado de una consulta agrupada.

Saludos.

adrall 15-05-2023 18:18:44

Expongo un código que me da un Warning y pido una solución para ese codigo sin utilizar variables incluidas en las expresiones para evitar el warning. Me respondeis con lo de que el mismo mensaje te da la solución o bien poneis código que es erroneo como el tuyo Casimiro.

Encuentro en Stackoverflow una solución para mi código que como dije en la pregunta sirve para "extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL arrastrando el saldo mediante la variable @isaldo" que, creo que no es dificil de entender.

En el enlace aparece un código que hace exactamente eso: extraer datos de una tabla arrastrando el saldo sin utilizar variables y lo comparto con vosotros.

delphi.com.ar 15-05-2023 21:13:05

Cita:

Empezado por adrall (Mensaje 551481)
Encuentro en Stackoverflow una solución para mi código que como dije en la pregunta sirve para "extraer los registros de una tabla simple, tipo cuenta bancaria en MySQL arrastrando el saldo mediante la variable @isaldo" que, creo que no es dificil de entender.

En el enlace aparece un código que hace exactamente eso: extraer datos de una tabla arrastrando el saldo sin utilizar variables y lo comparto con vosotros.

La verdad que para mi "extraer datos de una tabla arrastrando el saldo sin utilizar variables" no es algo claro, dado que no conozco ni el modelo de datos ni que quieres específicamente con "extraer". ¿Extraer datos relacionado por algún criterio, contabilizar, o simplemente acumular?
La solución que pones y la pregunta inicial, dan resultados muy distintos, según el resultado en el mismo sitio que nos has compartido: https://dbfiddle.uk/JtNBNuKa
OVER PARTITION agrupa, en cambio el código original acumula.

PD: Todos los que colaboran en el foro, invierten su tiempo desinteresadamente para ayudar al resto, si varios usuarios no comprendimos tu problema, o bien si es difícil de comprender, o no te has explicado del todo bien o simplemente no entendemos de la materia.

Saludos.

Casimiro Notevi 15-05-2023 21:28:58

Cita:

Empezado por adrall (Mensaje 551481)
... poneis código que es erroneo como el tuyo Casimiro.

Además de lo comentado por delphi.com.ar ¿por qué dices que mi código es erróneo? yo no he puesto ningún código, es un "metacódigo", un ejemplo, para que lo adaptes a tu código, o sea, para que uses el nombre de tus tablas, tus campos, tus variables, etc.

adrall 16-05-2023 11:32:43

Muchas gracias a los dos por vuestra ayuda.

Yo, más allá de si he hecho la pregunta 100% correcta, intentaba compartir un código que soluciona mi problema.

En cuanto al código de Casimiro, por supuesto que es un metacodigo y por supuesto que lo he adaptado a mis tablas / estructura pero repito, si ejecutas este código derivado de tu metacodigo:

Código SQL [-]
SET @variable:=0;
SELECT campo_que_sea FROM tabla INTO @variable;

Devuelve este error: Result consisted of more than one row.

Solo estoy informando de este punto.

Repito, muchas gracias

Casimiro Notevi 16-05-2023 11:42:38

No hay problema, nos alegra de que lo hayas solucionado ^\||/


La franja horaria es GMT +2. Ahora son las 16:02:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi