Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/10/2008, 12:20
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: Procedimiento Generador de Codigos ID

Un poco de SQL básico: Cuando capturas un parámetros o varios, siemrpe que solamente te devuelva un registro, la sentencia no es SELECT X=loquesea, porque eso es una comparación que te debería dar TRUE o FALSE.
La sentencia para volcar el resultado de un registro a una variable es
SELECT X INTO variable FROM TABLA;
o bien
SELECT X FROM TABLA INTO variable;

Además de eso, la función que encadena variables no es "+" sino CONCAT(),
Cuando sumas directamente los contenidos de variables de dferente tipo, se hacen conversiones implícitas que pueden dar resultados inesperados, y si alguna de esas contiene un NULL, el resultado simplemente será NULL.

Por otro lado, te cuento que el tipo TINYINT es riesgoso, porque solamente te deja un rango de 0 a 255 en UNSIGNED y -128 a +127 en SIGNED. Es muy corto.


De modo que en principio la cosa sería:
Código sql:
Ver original
  1. CREATE PROCEDURE SP_NUEVROL (IN nomrol VARCHAR(50), IN descrol VARCHAR(150))
  2. BEGIN
  3. DECLARE contador TINYINT;
  4. DECLARE codigonuevo TINYINT;
  5. DECLARE cadenaceros VARCHAR(3);
  6. DECLARE contcodigo VARCHAR(3);
  7. DECLARE ultimo VARCHAR(3);
  8. DECLARE nuevocod VARCHAR(3);
  9. SET nuevocod = 'R00';
  10. SELECT contador = COUNT(idrol) FROM MRoles;
  11. IF contador = 0 THEN
  12. SET nuevocod = 'R01';
  13. ELSE
  14. SELECT MAX(idrol)  FROM MRoles INTO ultimo;
  15. SET contcodigo = RIGHT(ultimo,2);
  16. SET contador = contcodigo;
  17. SET contador = contador + 1;
  18. SET cadenaceros =
  19. REPEAT('0', 2 - LENGTH(contador));
  20. SET nuevocod = CONCAT('R', cadenaceros, contador);
  21. END IF;
  22. INSERT INTO MRoles(idrol, nomrol, descrol) VALUES (nuevocod, nomrol, descrol);
  23. END;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)