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

MySQL Función IFNULL en un procedimiento

Estas en el tema de MySQL Función IFNULL en un procedimiento en el foro de Mysql en Foros del Web. Voy a explicar un poco el contexto, tengo una tabla de inscripción de alumnos en un determinado semestre, y una de cursos donde están los ...
  #1 (permalink)  
Antiguo 07/07/2012, 21:58
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 1
MySQL Función IFNULL en un procedimiento

Voy a explicar un poco el contexto, tengo una tabla de inscripción de alumnos en un determinado semestre, y una de cursos donde están los detalles de cada uno de los cursos, uno de esos datos son los créditos.

En un semestre un alumno no puede tomar más de 21 créditos, por lo cual se me asigna hacer un procedimiento en el que se cuenten los créditos aún disponibles en este semestre consultando a un alumno por su rut. Para ello debo revisar los créditos de un alumno sumándolos (usando una función SUM()) y luego restar 21.

Todo esto lo desarrollé en el procedimiento que se ve más abajo.

Código MySQL:
Ver original
  1. CREATE PROCEDURE creditos_alumno (IN rut VARCHAR(10))
  2. DECLARE var1 INT;
  3. SET var1 = 21 - (SELECT SUM(a.creditos) FROM asignaturas a, inscripciones i
  4. WHERE a.sigla = i.sigla
  5. AND rut=i.rut
  6. AND i.semestre = "2012-1");
  7. SELECT IFNULL(var1,21);

Si la suma de créditos inscritos es 0, entonces se devuelve 21, en caso contrario, se devuelve la resta entre 21 y la suma de créditos inscritos. Esto, lo resolví mediante la función IFNULL. ¿Porqué la usé? Porque si hago el SELECT a la variable var1 de la suma de créditos, me va a devolver en la línea de comandos un valor NULL cuando quiera consultar un alumno que no ha inscrito ramos (debería dar 21).

Mi duda es la siguiente: Aunque la función IFNULL funciona bien, estéticamente no se ve muy bien para la línea de comandos, la idea es que no me tire IFNULL(var1,21) con los créditos restantes sino que un nombre más adecuado. ¿Existe otra forma de realizar lo mismo que hace la función IFNULL sin tener que usar la función IFNULL? Se me ocurre usar una variable auxiliar y un IF pero las veces que lo he probado me han tirado errores al crear el procedimiento.

De antemano gracias.

Saludos.
  #2 (permalink)  
Antiguo 08/07/2012, 02:31
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: MySQL Función IFNULL en un procedimiento

Hola Amphoth3ra,

Puedes usar un alias para tu columna, quedaría algo como:

Código MySQL:
Ver original
  1. SELECT IFNULL(var1,21) AS credito_restante;
  #3 (permalink)  
Antiguo 08/07/2012, 07:27
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: MySQL Función IFNULL en un procedimiento

Aunque no era exactamente lo que estaba buscando, soluciona el problema que tenía, ahora el procedimiento quedó un poco más presentable, muchas gracias =)

Saludos.
  #4 (permalink)  
Antiguo 08/07/2012, 07:40
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: MySQL Función IFNULL en un procedimiento

Probaste algo así, por ejemplo (con un poco menos de trash code):
Código MySQL:
Ver original
  1. CREATE FUNCTION creditos_alumno (rut VARCHAR(10)) RETURNS INTEGER
  2.     DECLARE valret INT;
  3.     SELECT (21 - COALESCE(SUM(a.creditos), 0)) creditos
  4.     INTO valret
  5.     FROM
  6.         asignaturas a INNER JOIN inscripciones i ON a.sigla = i.sigla
  7.     WHERE
  8.         rut=i.rut
  9.         AND i.semestre = '2012-1';
  10.     RETURN valret;
Por cierto, ese SUM() sólo tiene sentido si por cada asignatura se puede obtener más de 1 credito. ¿Es así?
Otra cosa es que estas haciendo hardcoding de un parámetro, lo que significa que tendrías que tener una versión de este codigo por cada semestre... cosa que no parece una buena idea.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/07/2012, 09:17
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: MySQL Función IFNULL en un procedimiento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por cierto, ese SUM() sólo tiene sentido si por cada asignatura se puede obtener más de 1 credito. ¿Es así?
Es uno o varios, en la práctica un ramo puede tener mínimo 1 y máximo 5 créditos.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Otra cosa es que estas haciendo hardcoding de un parámetro, lo que significa que tendrías que tener una versión de este codigo por cada semestre... cosa que no parece una buena idea.
Está diseñado de esa forma, solo cubre un semestre en específico. Puede haber otros semestres en la tabla de inscripciones, pero con el único semestre que trabajo es con el actual.

Saludos.
  #6 (permalink)  
Antiguo 08/07/2012, 10:15
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: MySQL Función IFNULL en un procedimiento

Cita:
Está diseñado de esa forma, solo cubre un semestre en específico. Puede haber otros semestres en la tabla de inscripciones, pero con el único semestre que trabajo es con el actual.
¿Y no sería más sensato parametrizarlo desde el principio, y ahorrarte correcciones futuras?
A fin de cuentas, eso sólo implicaría hacer algo como:
Código MySQL:
Ver original
  1. CREATE FUNCTION creditos_alumno (rut VARCHAR(10), vsemestre VARCHAR(6)) RETURNS INTEGER
  2.     DECLARE valret INT;
  3.     SELECT (21 - COALESCE(SUM(a.creditos), 0)) creditos
  4.     INTO valret
  5.     FROM
  6.         asignaturas a INNER JOIN inscripciones i ON a.sigla = i.sigla
  7.     WHERE
  8.         rut=i.rut
  9.         AND i.semestre = vsemestre;
  10.     RETURN valret;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 08/07/2012, 14:54
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: MySQL Función IFNULL en un procedimiento

Podría ser, pero para lo que yo quiero no es estrictamente necesario, lo relevante es que me entregue los créditos.

En todo caso para la solución final del problema opté por cambiar el procedimiento por una función, que así quedó:
Código MySQL:
Ver original
  1. CREATE FUNCTION creditos_alumno (rut VARCHAR(10)) RETURNS INT
  2. DECLARE valor INT;
  3. SET valor = 21 - (SELECT SUM(a.creditos) FROM asignaturas a, inscripciones i
  4. WHERE a.sigla = i.sigla
  5. AND rut=i.rut
  6. AND i.semestre = "2012-1");
  7. RETURN (SELECT IFNULL(valor,21));

No tengo nada más que decir que gracias por las sugerencias =)

Saludos.

Etiquetas: ifnull, procedimiento, select, tabla
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 17:02.