Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/07/2011, 19:41
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: 17 años
Puntos: 2658
Respuesta: No funciona While en Phpmyadmin

Vamos por partes:

- Lo primero que tienes que entender es que no existe un estándar en el T-SQL, por lo que técnicamente no existe un lenguaje unificado para scripts (esos "jobs" a los que te refieres) entre los diferentes DBMS (Oracle, SQL Server, DB2, MySQL, etc.), sino que cada uno de ellos pone y saca cosas como se le antoja, como así también agrega funciones propias para el estandar SQL.
Por estas razones migrar scripts entre DBMS es una tarea muy engorrosa y bastante cansadora.

- SQL Server y Oracle incluyeron dentro de su versión de T-SQL controles de flujo como WHILE, pero MySQL sólo los implementó en stored procedures (por cierto, trabajar en bases de datos y no saber qué es un stored procedure es algo medio extraño), por lo que no podrás crear scripts de SQL para MySQL que los contengan. Si puedes hacerlo en un SP, y en el script podrás invocar a los SP, por lo que hay alguna forma de burlar este impedimento.
Técnicamente hablando, el código de muestra que pones en tu post, sería un stored procedure si se invoca bajo un nombre determinado.

- El uso de parámetros, variables de usuario y variables locales de procedimientos no están implementadas de la misma forma en los diferentes DBMS. Para implementar este mismo proceso de ejemplo requiere una explicación más detallada de la forma de programar los SP.


- Una primera aproximación a tu caso de ejemplo sería:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `procedimiento001` ()
  4.     DECLARE countmin INT;
  5.     DECLARE countmax INT;
  6.     DECLARE guild varchar(300);
  7.     SELECT MIN(IDHELPJ), MAX(IDHELPJ) FROM UserLogin.HelPJ INTO countmin, countmax;
  8.     WHILE countmin <= countmax DO
  9.         SET guild = (SELECT GuildID
  10.                     FROM Tantra.TantraBackup00 T INNER JOIN UserLogin.HelPJ H ON T.UserID = H.IDHELPJ
  11.                     WHERE IDHELPJ = countmin LIMIT 1);
  12.         IF guild IS NOT NULL AND guild !=0 THEN
  13.             UPDATE UserLogin.HelPJ SET CLANACTUAL = guild WHERE IDHELPJ = countmin;
  14.         ELSE
  15.             UPDATE UserLogin.HelPJ SET CLANACTUAL = NULL WHERE IDHELPJ = countmin;
  16.         END IF;
  17.         SET countmin = countmin + 1;
  18.     END WHILE;
  19. END$$
  20.  
  21. DELIMITER;

Desde aqui se pueden observar algunas cosas:
- Las variables locales de un stored procedure no llevan "@". Solo las de usuario lo usan, pero ese es un tema especial.
- No se anidan los BEGIN/END en MySQL. Se peuden encadenar, pero no anidar.
- Todo SP multilínea debe llevar BEGIN/END.
- Todas las sentencias se terminan con ";".
- Para hacer que el script del SP se carge de un solo golpe, se cambian los delimitadores de sentencia por otro, y luego se los restaura (no se hace si se cargan desde un lenguaje de programación).
- La sintaxis de WHILE es distinta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)