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

CURSOR arroja Column ... cannot be null cuando consulta es vacia

Estas en el tema de CURSOR arroja Column ... cannot be null cuando consulta es vacia en el foro de Mysql en Foros del Web. Estimados, tengo un CURSOR del que obtengo 2 parámetros para luego pasarselos a otro CURSOR. El problema es que hay veces en que la respuesta ...
  #1 (permalink)  
Antiguo 26/01/2010, 08:36
 
Fecha de Ingreso: enero-2007
Mensajes: 97
Antigüedad: 17 años, 3 meses
Puntos: 1
CURSOR arroja Column ... cannot be null cuando consulta es vacia

Estimados, tengo un CURSOR del que obtengo 2 parámetros para luego pasarselos a otro CURSOR. El problema es que hay veces en que la respuesta es simplemente vacia y al intentar hacer un volcado de los datos con el FETCH me aparece:

Column 'id_tarj' cannot be null


Código SQL:
Ver original
  1. BEGIN
  2.  
  3. DECLARE IDACTA INTEGER;
  4. DECLARE NROSECCION INTEGER;
  5. DECLARE IDTARJ INTEGER;
  6. DECLARE doneC1 BOOLEAN DEFAULT FALSE;
  7. DECLARE TPROD FLOAT;
  8.  
  9. DECLARE C1 CURSOR FOR
  10. (
  11.     SELECT a.id_acta,seccion_tarj
  12.     FROM `pro_tarja` p, acta a
  13.     WHERE p.id_acta=a.id_acta AND a.id_empr=IDEMPR
  14. );
  15. DECLARE C2 CURSOR FOR
  16. (
  17.     SELECT
  18.     id_tarj, SUM(totproddia_noti) AS totPROD
  19.     FROM notificacion n,acta a, secuencia s, pro_tarja p
  20.     WHERE
  21.     n.id_acta=a.id_acta AND a.id_acta=s.id_acta AND n.id_secu=s.id_secu AND
  22.     p.id_acta=a.id_acta AND p.seccion_tarj=s.numseccion_secu
  23.     AND n.id_acta          =IDACTA
  24.     AND s.numseccion_secu  =NROSECCION
  25. );
  26. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
  27. BEGIN
  28.     SET doneC1 = TRUE;
  29. END;
  30.  
  31. -- abro el cursor 1
  32. OPEN C1;
  33.  
  34.     C1_loop:
  35.      LOOP  
  36.                 -- por cada registro encontrado llamo al cursor 2 con las variables requeridas
  37.         FETCH C1 INTO IDACTA, NROSECCION;  
  38.          
  39.         IF `doneC1` THEN LEAVE C1_loop; END IF;      
  40.                
  41.         OPEN C2;
  42.             FETCH C2 INTO IDTARJ,TPROD;
  43.                 -- AQUI EL ERROR ..y unas rutinas que no importan
  44.         CLOSE C2;
  45.  
  46.      END LOOP C1_loop;      
  47.  
  48. CLOSE C1;  
  49.  
  50. END

Porfa una orientación de como puedo abordar este tema.
Gracias!!
__________________
-La duda es la base del conocimiento-
  #2 (permalink)  
Antiguo 26/01/2010, 08:58
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: CURSOR arroja Column ... cannot be null cuando consulta es vacia

Pon ese cursor en un IF donde compruebes que el parámetro es NOT NULL..
Código MySQL:
Ver original
  1.  
  2. DECLARE NROSECCION INTEGER;
  3. DECLARE TPROD FLOAT;
  4.  
  5. DECLARE C1 CURSOR FOR
  6. (
  7.     SELECT a.id_acta,seccion_tarj
  8.     FROM `pro_tarja` p, acta a
  9.     WHERE p.id_acta=a.id_acta AND a.id_empr=IDEMPR
  10. );
  11. DECLARE C2 CURSOR FOR
  12. (
  13.     SELECT
  14.     id_tarj, SUM(totproddia_noti) AS totPROD
  15.     FROM notificacion n,acta a, secuencia s, pro_tarja p
  16.     WHERE
  17.     n.id_acta=a.id_acta AND a.id_acta=s.id_acta AND n.id_secu=s.id_secu AND
  18.     p.id_acta=a.id_acta AND p.seccion_tarj=s.numseccion_secu
  19.     AND n.id_acta          =IDACTA
  20.     AND s.numseccion_secu  =NROSECCION
  21. );
  22. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
  23.     SET doneC1 = TRUE;
  24.  
  25. -- abro el cursor 1
  26. OPEN C1;
  27.  
  28.     C1_loop:
  29.      LOOP  
  30.                 -- por cada registro encontrado llamo al cursor 2 con las variables requeridas
  31.         FETCH C1 INTO IDACTA, NROSECCION;  
  32.          
  33.         IF `doneC1` THEN
  34.             LEAVE C1_loop;
  35.         ELSEIF C1 IS NOT NULL;
  36.             OPEN C2;
  37.                 FETCH C2 INTO IDTARJ,TPROD;
  38.             CLOSE C2;
  39.         END IF;      
  40.      END LOOP C1_loop;      
  41.  
  42. CLOSE C1;  
  43.  
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/01/2010, 09:26
 
Fecha de Ingreso: enero-2007
Mensajes: 97
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

Gracias gnzsoloyo por tu pronta respuesta. El CURSOR1 siempre me va a entregar resultados, el problema lo tengo con el CURSOR2 que puede o no entregar respuesta vacia dependiendo de los parámetros entregados por el cursor1.

Ahora, tomando tu respuesta probé con:

Código SQL:
Ver original
  1. OPEN C1;
  2.  
  3.     C1_loop:
  4.      LOOP  
  5.         FETCH C1 INTO IDACTA, NROSECCION;  
  6.          
  7.         IF `doneC1` THEN LEAVE C1_loop; END IF;      
  8.  
  9.         OPEN C2;
  10.            
  11.             IF C2 IS NOT NULL THEN
  12.                 FETCH C2 INTO IDTARJ,TPROD;
  13.                -- +rutina                  
  14.             END IF;
  15.        
  16.         CLOSE C2;
  17.        
  18.      END LOOP C1_loop;      
  19.  
  20. CLOSE C1;

y con:

Código SQL:
Ver original
  1. OPEN C1;
  2.  
  3.     C1_loop:
  4.      LOOP  
  5.         FETCH C1 INTO IDACTA, NROSECCION;  
  6.          
  7.         IF `doneC1` THEN LEAVE C1_loop; END IF;      
  8.  
  9.         OPEN C2;
  10.  
  11.             FETCH C2 INTO IDTARJ,TPROD;
  12.  
  13.             IF C2 IS NOT NULL THEN
  14.                 -- +rutina                 
  15.             END IF;
  16.        
  17.         CLOSE C2;
  18.        
  19.      END LOOP C1_loop;      
  20.  
  21. CLOSE C1;

Pero en ambos casos me retorna "Unknown column 'C2' in 'field list'".

Gracias por tu ayuda.
__________________
-La duda es la base del conocimiento-
  #4 (permalink)  
Antiguo 26/01/2010, 11:08
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: CURSOR arroja Column ... cannot be null cuando consulta es vacia

Código MySQL:
Ver original
  1.  
  2. DECLARE NROSECCION INTEGER;
  3. DECLARE TPROD FLOAT;
  4.  
  5. DECLARE C1 CURSOR FOR
  6. (
  7.     SELECT a.id_acta,seccion_tarj
  8.     FROM `pro_tarja` p, acta a
  9.     WHERE p.id_acta=a.id_acta AND a.id_empr=IDEMPR
  10. );
  11. DECLARE C2 CURSOR FOR
  12. (
  13.     SELECT
  14.     id_tarj, SUM(totproddia_noti) AS totPROD
  15.     FROM notificacion n,acta a, secuencia s, pro_tarja p
  16.     WHERE
  17.     n.id_acta=a.id_acta AND a.id_acta=s.id_acta AND n.id_secu=s.id_secu AND
  18.     p.id_acta=a.id_acta AND p.seccion_tarj=s.numseccion_secu
  19.     AND n.id_acta          =IDACTA
  20.     AND s.numseccion_secu  =NROSECCION
  21. );
  22. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
  23.     SET doneC1 = TRUE;
  24.  
  25. -- abro el cursor 1
  26. OPEN C1;
  27.  
  28.     C1_loop:
  29.      LOOP  
  30.         FETCH C1 INTO IDACTA, NROSECCION;  
  31.          
  32.         IF `doneC1` THEN
  33.             LEAVE C1_loop;
  34.         ELSEIF IDACTA IS NOT NULL;
  35.             OPEN C2;
  36.                 FETCH C2 INTO IDTARJ,TPROD;
  37.             CLOSE C2;
  38.         END IF;      
  39.      END LOOP C1_loop;      
  40.  
  41. CLOSE C1;  
  42.  
__________________
¿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 27/01/2010, 06:34
 
Fecha de Ingreso: enero-2007
Mensajes: 97
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

gnzsoloyo gracias pero tu respuesta fue la misma, el código igual genera error.

En concreto lo que NO se puede hacer es:

Código SQL:
Ver original
  1. OPEN C2;
  2.    FETCH C2 INTO IDTARJ,TPROD;
  3. CLOSE C2;
SI EL CURSOR C2 retorna vacio ya que intentará colocar un NULL en el IDTARJ (campo que es entero no nulo ya que es un ID). Si no tubiese que volcar el cursor en campos enteros no habría problema pero este no es el caso.

Se agredece la colaboración.
__________________
-La duda es la base del conocimiento-

Última edición por phidalgo; 27/01/2010 a las 06:39
  #6 (permalink)  
Antiguo 27/01/2010, 07:19
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

En pocas palabras...

Cuando llenas el cursor2 con la segunda consulta... hay registros que se retornan en null?

No lo podrías controlar desde la consulta utilizando ifnull?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 27/01/2010, 07:42
 
Fecha de Ingreso: enero-2007
Mensajes: 97
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

No son "algunos" registros nulos, sino que la consulta entera es vacia.

Para simplificar supongamos tengo este cursor:
Código SQL:
Ver original
  1. DECLARE miCursor CURSOR FOR(    
  2. SELECT id_per, nombre_per FROM `personas` WHERE codigo_per=123
  3. );
Ok, ahora si NO EXISTEN resultados para la búsqueda al hacer
FETCH miCursor INTO ID,NOMBRE;
el procedimiento arrojaría "Column id_per cannot be null" porque "ID" por obligación es definido como INTEGER.

Gracias por su atención.
__________________
-La duda es la base del conocimiento-
  #8 (permalink)  
Antiguo 27/01/2010, 07:52
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: CURSOR arroja Column ... cannot be null cuando consulta es vacia

¿Y si pruebas evitar tener que ahcer dos cursores. Eso sería, en definitiva, hacer que una sola consulta te devuelva la tabla de datos necesaria, lo que se puede hacer con una consulta menos simplista.
Algo (tal vez) así:

Código MySQL:
Ver original
  1.  
  2. DECLARE NROSECCION INTEGER;
  3. DECLARE TPROD FLOAT;
  4.  
  5.   /* Declarando un cursos que devuelva todos los valores válidos */
  6.   DECLARE C1 CURSOR FOR
  7.     id_tarj, SUM(totproddia_noti) AS totPROD
  8.   FROM notificacion n INNER JOIN acta a USING(id_acta)
  9.       INNER JOIN secuencia s USING(id_secu)
  10.       INNER JOIN pro_tarja p USING(id_acta)
  11.     p.seccion_tarj=s.numseccion_secu
  12.     AND s.numseccion_secu  =NROSECCION
  13.     AND n.id_acta IN
  14.       (
  15.       SELECT a.id_acta,seccion_tarj
  16.       FROM `pro_tarja` p INNER JOIN acta a USING(id_acta)
  17.       WHERE a.id_empr=IDEMPR;
  18.       );
  19.   /* HANDLER */
  20.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
  21.   SET doneC1 = TRUE;
  22.  
  23.   -- abro el cursor 1
  24.   OPEN C1;
  25.   C1_loop: LOOP
  26.     FETCH C1 INTO IDTARJ,TPROD;
  27.     /* ********************************************** */
  28.     /*                TAREAS INDICADAS                */
  29.     /* ********************************************** */
  30.   END LOOP C1_loop;
  31.  
  32.   CLOSE C1;
  33.  
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 27/01/2010, 08:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

mira esto
http://dev.mysql.com/doc/refman/5.0/es/fetch.html

entra al ejemplo del enlace que te puse, donde muestran como declarar los handlers para evitar el sqlstate 02000 que se presenta cuando el cursor no tiene registros.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 11/03/2010, 17:33
 
Fecha de Ingreso: enero-2007
Mensajes: 97
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: CURSOR arroja Column ... cannot be null cuando consulta es vacia

Hola, sorry pero había olvidado comentar los resultados y cerrar el tema. Resulta que revisé detenidamente cada uno de las recomendaciones que me dieron pero siguió generando error.
Al final lo que hice para salir del paso fue hacer otro cursor para que me contara cuantos registros iba a tener y luego en función si eran mayores que cero procedía con el cursor que arrojaba error.
Eso, gracias igual por sus siempre rápidas respuestas.
__________________
-La duda es la base del conocimiento-

Etiquetas: column, cuando, cursor, null, vacias
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 04:06.