Ver Mensaje Individual
  #8 (permalink)  
Antiguo 13/06/2015, 19:37
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Se puede hacer esto en una sql?

Bueno, ahora que tengo tiempo, y estoy frente a mi notebook, puedo contestarte un poco más claramente. Antes he posteado mensajes cortos porque estaba tratando de guiarte desde mi celular, y no siempre se escribe lo suficientemente rápido.

Como sea, empecemos por una aclaración:
Cita:
he probado con el declare y el set y luego una sql y no aparece nada, me da error en el mysql.
Eso es lo que he puesto, lo he hecho, ¿o ni siquiera me has leido?
Si, te leí perfectamnete, y lo entendi bien claro. Y mi respuesta sigue siendo la misma en muchos sentidos: Necesitas leer el manual de referencia para entender como funciona MySQL, y en qué se diferencia de otros DBMS. Si te lo dije, y considerando el problema que planteas, creo que como mínimo deberías haber hecho eso...
Es lo que hacemos todos, antes de ir a pregutnar cosas base, como la de variables...

Como sea, la cosa es así: MySQL maneja dos tipos de variables y en dos entornos diferentes. Por un lado las variables locales de stored procedures, que se deben declarar con DECLARE, y sólo existen en el momento de ejecución del SP, y únicamente dentro del cuerpo del SP.
Por otro lado existen variables de usuario, que no se deben declarar, sino sólo inicializar, y que existen en una conexión de MySQL, permaneciendo hasta tanto se cierre o caiga la conexión a MySQL, por la razón que sea.
Las primeras son locales de los SP deben tener nombres que comienzan con letras, y no pueden llevar signos en su nombre; deben declararse por tipo de dato reconocido por MySQL, y sólo operan con datos del mismo tipo.
Las variables de usuario deben comenzar su nombre con "@" en todos los casos, y siempre que se las invoca se debe poner el nombre de la misma forma.

Ahora bien, como dije, una variable declarada con DECLARE no puede usarse fuera de una rutina almacenada, como tampoco el DECLARE funciona fuera de ella.
Código MySQL:
Ver original
  1. DELIMTER $$
  2. CREATE PROCEDURE procedimiento(IN nombre VARCHAR(200))
  3.   DECLARE id INT;
  4.   SET id = 0;
  5.   SELECT idTabla
  6.   FROM tabla
  7.   WHERE nombre = nombre
  8.   LIMIT 1
  9.   INTO id;
  10.  
  11.   SELECT id;
  12. END$$
  13.  
  14. DELIMITER ;
Este sería un ejemplo de un SP creado por consola de MySQL, que puede recibir un parámetro de tipo VARCHAR para buscar un único registro y devolver su ID.
Alli se puede apreciar como se declara una variable, se la inicializa y se la carga con lo obtenido en el SP, para terminar exponiendo como salida el resultado de la búsqueda. Es un SP bastante inutil, pero para el ejemplo sirve.

Ahora bien, las variables de usuario pueden usarse dentro de la conexión en modo consola, o ejecutarse de cualquier forma y conservan su valor, en tanto la conexión donde se crean no se cierre.
Pero como no tienen tipo de ato, adoptarán el que tenga cuando se las inicializa, cosa que hay que hacer obligatoriamente, porque de lo contrario su valor es NULL, y eso destruye cualquier operación que se haga con ellas (sumar, multiplicar, concatenar, restar, dividir, o combinar cualquier da,to con un NULL da NULL).
Código MySQL:
Ver original
  1. SET @id = 0;
  2.   SELECT idTabla
  3.   FROM tabla
  4.   WHERE nombre = 'nombre bsucado'
  5.   LIMIT 1
  6.   INTO @id;
  7.   SELECT @id;
Otro detalle a tener en cuenta es que una variable de usuario adopta el valor en el mismo paso donde esta asignación ocurre, y si en la misma sentencia su valor cambia más de una vez, el valor resultante real es el final.
Código MySQL:
Ver original
  1. mysql> SELECT (@id:=1) a, @id,
  2.     ->     (@id:=@id+1) b,  @id,
  3.     ->     (@id:=@id+1) c,  @id,
  4.     ->     (@id:=@id-1) e,  @id,
  5.     ->     (@id:=@id * 110) f, @id;
  6. +---+------+------+------+------+------+------+------+------+------+
  7. | a | @id  | b    | @id  | c    | @id  | e    | @id  | f    | @id  |
  8. +---+------+------+------+------+------+------+------+------+------+
  9. | 1 |    1 |    2 |    2 |    3 |    3 |    2 |    2 |  220 |  220 |
  10. +---+------+------+------+------+------+------+------+------+------+
  11. 1 row in set (0.00 sec)
  12. mysql> SELECT @id;
  13. +------+
  14. | @id  |
  15. +------+
  16. |  220 |
  17. +------+
  18. 1 row in set (0.00 sec)
Como puedes ver en el ejemplo, la asignación dinámica (en MySQL se hace con ":=" en la misma sentencia), genera una sucesion de valores diferentes para la variable, cada uno en su propio punto de la misma SELECT.

Por este tipo de cosas es difícil dominar las variables de usuario en MYSQL sin bastante práctica.

¿Se va entendiendo?

Una nota final: Una variable de usuario puede crearse en un SP y ser visible fuera de él, en tanto la conexión no se cierre. Poer hay que recordar que una segunda ejecución del mismo SP "verá" la variable como estaba luego de la anterior ejecución, es decir CON valor.
Como los valores de las variables de usuario no se pierden sino al cerrarse la conexión, entonces deben siempre ser reinciializadas antes de ser usadas, para anular sus valores.

¿Va quedando más claro ahora?

Cita:
No creo que pueda usar un store procedure con la tecnologia que estoy mirando,
Eso que dices no tiene sentido: TODO lenguaje de programación puede invocar stored procedures a una base de datos. TODOS.
Que no sepas como hacerlo en le lenguaje que elegiste, no es lo mismo que decir no se puede. En todo caso deberás acudir al manual de referncia de ese lenguaje par ver cómo se hace...

O sea: Lee los manuales.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)