Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/02/2009, 16:51
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: Ayuda con Procedimiento almacenado

La cosa tiene varios errores:
1. Un store procedure no devuelve valores con RETURN. Eso lo hace un Store Function, que no es lo mismo. Además en el prototipo del SF debe ir el tipo de dato devuelto.

2. El condicional IF/ELSE está incompleto. Lee el manual de referencia para ponerlo correctamente; el cierre de IF es THEN, y además te has olvidado el delimitador de sentencia en el END IF... el cual no has puesto.

3. Poner un valor en una variable, que puede darte NULL, es inecesario si luego vas a usar un IS NULL. Lo puedes hacer dentro del IF.

4. Te has complicado innecesariamente para hacer la creación del código, usando EXTRACT para obtener un valor que puedes controlar con YEAR(). Por otro lado, si extraes un codigo viejo, este, por la forma que lo has planeado, contiene un número que no comienza con cero, por lo que simplemente lo puedes manejar como entero, lo que es más sencillo.


La idea, finalmente, sería algo así:
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS generaCodigoFA $$
  4. CREATE FUNCTION generaCodigoFA() RETURNS VARCHAR(50)
  5. READS SQL DATA
  6. BEGIN
  7.   DECLARE codigoMax VARCHAR(50);
  8.   DECLARE nuevoCodigo VARCHAR(50);
  9.   IF (SELECT MAX(T_CodigoFichaAdm) FROM fichainscripcionadm)IS NULL THEN
  10.     SET nuevoCodigo = CONCAT('A',YEAR(NOW()),'0001');
  11.   ELSE
  12.     SET codigoMax = (SELECT MAX(T_CodigoFichaAdm) FROM fichainscripcionadm);
  13.     SET nuevoCodigo = (CONCAT('A',CAST(RIGHT(codigoMax,8) AS UNSIGNED INTEGER) + 1));
  14.   END IF;
  15. RETURN nuevoCodigo;
  16. END $$
  17.  
  18. DELIMITER ;

Como método me parece algo rústico y propenso a errores. Creo que deberías tratar de resolver esto dentro del código de la aplicación, y no dejarlo a la base de datos.
Pero es sólo una opinión.

Pruébalo y me cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)