Ver Mensaje Individual
  #13 (permalink)  
Antiguo 15/04/2012, 08:06
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: Procedimientos almacenados variable out

No, pero el fin de semana lo dedico más a jugar con mis hijos...

Mira, para transformar dos datos en un "código" (personalmente lo solucionaría de otra forma, pero es tu decisión), en tu caso no es necesario que uses dos stored procedures, sino un stored procedure y un stored function.
Los SF son parecidos a los SP, pero sólo devuelven un único valor, no pueden devolver tablas y todos sus parámetros son IN., pero es exactamente lo que necesitas.
El modelo de clave que usas está compuesta en realidad de dos datos, nada más: Una cadena y un número, con longitud fija y rellenado de ceros a la izquierda. Entonces para lograr una función que devuelva eso necesitas:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION generarclave(v_cadena varchar(50), v_numero INT, v_ancho INT) RETURNS VARCHAR(50)
  3.     DECLARE retorno VARCHAR(50);
  4.     SET retorno = CONCAT(v_cadena, LPAD(v_numero, v_ancho, '0'));
  5.     RETURN retorno;
  6. END$$
  7. DELIMITER ;
Este tipo de SF daría como resultado:
Código SQL:
Ver original
  1. mysql> SELECT GENERARCLAVE('USU', 123, 5);
  2. +-----------------------------+
  3. | GENERARCLAVE('USU', 123, 5) |
  4. +-----------------------------+
  5. | USU00123                    |
  6. +-----------------------------+
  7. 1 ROW IN SET (0.00 sec)

El SP sería, entonces:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE usu_nuevo(INOUT codusu VARCHAR(8),IN id VARCHAR(20), IN pass VARCHAR(20))
  3.     DECLARE v_cod INT;
  4.     SET v_cod = (SELECT (numero + 1) FROM `generador` WHERE Parametro = 'usuarios');
  5.     SET codusu = generarclave('usu', v_cod, 5);
  6.     INSERT INTO usuarios VALUES(codusu, id, pass);
  7. END$$
  8. DELIMIITER ;

Incluso, si lo que quieres es que te devuelva una clave que puedas crear más dinámicamnete, especificando el ancho de la cadena que quieres que tome, lo único que debes hacer es agregar el parámetro para ser usado donde corresponda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)