Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda con Procedimiento almacenado

Estas en el tema de Ayuda con Procedimiento almacenado en el foro de Mysql en Foros del Web. Se trata de un procedimiento que me genera un codigo =/ la tabla "fichainscripcionadm" la tengo vacia por lo tanto el codigo maximo es NULL ...
  #1 (permalink)  
Antiguo 27/02/2009, 13:32
 
Fecha de Ingreso: febrero-2009
Mensajes: 1
Antigüedad: 15 años, 1 mes
Puntos: 0
Mensaje Ayuda con Procedimiento almacenado

Se trata de un procedimiento que me genera un codigo =/ la tabla "fichainscripcionadm" la tengo vacia por lo tanto el codigo maximo es NULL
me da error a la hora de setear la variable nuevoCodigo =/ AYUDA !!!

CREATE PROCEDURE generaCodigoFA()
BEGIN

DECLARE codigoMax VARCHAR(50);
DECLARE nuevoCodigo VARCHAR(50);

SET codigoMax = (SELECT MAX(T_CodigoFichaAdm) FROM fichainscripcionadm);
/*
consultar el Codigo Maximo
seteo codigoMax ...
*/

IF ( codigoMax IS NULL )

SET nuevoCodigo=(SELECT CONCAT('A',EXTRACT(YEAR FROM CURDATE()),'0001'));
/*
codigoMax = NULL
entonces nuevoCodigo=A20090001
*/

ELSE

SET nuevoCodigo=(SELECT CONCAT('A',right(concat('000000000',right(max(T_Co digoFichaAdm),8)+1),8)) from fichainscripcionadm);
/*
en la siguiente cuando codigoMax no es NULL
seria ... nuevoCodigo=A20090002
*/

RETURN nuevoCodigo;
/* retornar nuecoCodigo */
END
  #2 (permalink)  
Antiguo 27/02/2009, 16:51
Avatar de 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, 4 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)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:56.