Ver Mensaje Individual
  #13 (permalink)  
Antiguo 01/03/2011, 10:17
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: 17 años
Puntos: 2658
Respuesta: Resultado null de una select en un procedimiento almacenado

Me parece que no estás entendiendo la idea:
El CURSOR lo usas para leer uno a uno un conjunto de registros dado, luego, con cada registro si y sólo si no has superado el límite (SQLSTATE '02000'), haces un INSERT. Pero si has llegado al final, el último FETCH devuelve NULL y pone done = 1, por lo que no entra en el IF que contiene el INSERT, pero sí realiza la asignación de NULL a todas las variables.
¿Se entiende ahora?
A partir de ese último FETCH, ANYTRA contiene un NULL.
Para que te devuelva el valor de ANYTRA la idea sería:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3.   DECLARE PRUEBA INT(4) DEFAULT 999;
  4.   DECLARE done INT DEFAULT 0;
  5.   /* ------------------------------------------------------------------------ */
  6.   DECLARE T_ANYTRA INT(4);
  7.   /* ------------------------------------------------------------------------ */
  8.   DECLARE ANYTRA INT(4);
  9.   DECLARE W_ANYTRA INT(4);
  10.   DECLARE MESTRA int(2);
  11.   DECLARE NOMMES varchar(15);
  12.   DECLARE NCUENTA varchar(30);
  13.   DECLARE NOMCLIENTE varchar(255);
  14.   DECLARE CODREPRE varchar(20);
  15.   DECLARE NOMREPRE varchar(50);
  16.   DECLARE MES_ACTUAL_IMP float(15,2);
  17.   DECLARE MES_ACTUAL_CANT float(15,2);
  18.   DECLARE IMPBRU float(11,2);
  19.   DECLARE DTOFAM float(11,2);
  20.   DECLARE DTOART float(11,2);
  21.   DECLARE DTOCAB float(11,2);
  22.   DECLARE DTOOTR float(11,2);
  23.   DECLARE PRECIO float(11,2);
  24.   DECLARE PRECOS float(11,2);
  25.   DECLARE VAR_MES_ANT_IMP float(15,2);
  26.   DECLARE VAR_MES_ANT_IMP_PCT float(10,2);
  27.   DECLARE VAR_MES_ANT_CANT float(15,2);
  28.   DECLARE VAR_MES_ANT_CANT_PCT float(10,2);
  29.   DECLARE VAR_FIN_ANY_IMP float(15,2);
  30.   DECLARE VAR_FIN_ANY_IMP_PCT float(10,2);
  31.   DECLARE VAR_FIN_ANY_CANT float(15,2);
  32.   DECLARE VAR_FIN_ANY_CANT_PCT float(10,2);
  33.   DECLARE VAR_INTERANUAL_IMP float(15,2);
  34.   DECLARE VAR_INTERANUAL_IMP_PCT float(10,2);
  35.   DECLARE VAR_INTERANUAL_CANT float(15,2);
  36.   DECLARE VAR_INTERANUAL_CANT_PCT float(10,2);
  37.   DECLARE VAR_PRESUPUESTO_IMP float(15,2);
  38.   DECLARE VAR_PRESUPUESTO_IMP_PCT float(10,2);
  39.   DECLARE VAR_PRESUPUESTO_CANT float(15,2);
  40.   DECLARE VAR_PRESUPUESTO_CANT_PCT float(10,2);
  41.  
  42.   DECLARE CUR_VENTAS_CLIENTE_REPRE CURSOR FOR
  43.   SELECT * FROM VENTAS_CLIENTE_REPRE_BACKUP;
  44.  
  45.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  46.  
  47.   OPEN CUR_VENTAS_CLIENTE_REPRE;
  48.  
  49.     FETCH CUR_VENTAS_CLIENTE_REPRE INTO
  50.       ANYTRA,MESTRA,NOMMES,NCUENTA,NOMCLIENTE,CODREPRE,N OMREPRE,
  51.       MES_ACTUAL_IMP,MES_ACTUAL_CANT,IMPBRU,DTOF AM,DTOART,DTOCAB,
  52.       DTOOTR,PRECIO,PRECOS,VAR_MES_ANT_ IMP,vAR_MES_ANT_IMP_PCT,VAR_MES_ANT_CANT,
  53.       VAR_MES_A NT_CANT_PCT,VAR_FIN_ANY_IMP,VAR_FIN_ANY_IMP_PCT,
  54.       VAR_FIN_ANY_CANT,VAR_FIN_ANY_CANT_PCT,VAR_INTERANUAL _IMP,
  55.       VAR_INTERANUAL_IMP_PCT,VAR_INTERANUAL_CANT,VA R_INTERANUAL_CANT_PCT,
  56.       VAR_PRESUPUESTO_IMP,VAR_PRES UPUESTO_IMP_PCT,VAR_PRESUPUESTO_CANT,
  57.       VAR_PRESUPUESTO_CANT_PCT;
  58.     IF NOT done THEN
  59.       /* Inserción de los registros de referencia agrupados por CLIENTE y REPRE */
  60.       INSERT INTO VENTAS_CLIENTE_REPRE_BACKUP
  61.       VALUES(ANYTRA, MESTRA, NULL, NCUENTA, NOMCLIENTE, CODREPRE, NOMREPRE,
  62.       MES_ACTUAL_IMP, MES_ACTUAL_CANT, IMPBRU, DTOFAM,
  63.       DTOART,DTOCAB,DTOOTR,PRECIO,PRECOS,
  64.       VAR_MES_ANT_I MP,vAR_MES_ANT_IMP_PCT,VAR_MES_ANT_CANT,
  65.       VAR_MES_AN T_CANT_PCT,VAR_FIN_ANY_IMP,VAR_FIN_ANY_IMP_PCT,
  66.       VAR _FIN_ANY_CANT,VAR_FIN_ANY_CANT_PCT,VAR_INTERANUAL_IMP,
  67.       VAR_INTERANUAL_IMP_PCT,VAR_INTERANUAL_CANT,VAR_INTERANUAL_CANT_PCT,
  68.       VAR_PRESUPUESTO_IMP,VAR_PRESU PUESTO_IMP_PCT,
  69.       VAR_PRESUPUESTO_CANT,VAR_PRESUPUEST O_CANT_PCT);
  70.  
  71.       UPDATE VENTAS_CLIENTE_REPRE_BACKUP SET NOMMES=InformarNombreMes(MESTRA);
  72.       /* ------------------------------------------------------------------------ */
  73.       SET T_ANYTRA = ANYTRA;
  74.       /* ------------------------------------------------------------------------ */
  75.     END IF;
  76.   UNTIL done END REPEAT;
  77.  
  78.   CLOSE CUR_VENTAS_CLIENTE_REPRE;
  79.  
  80.   RETURN T_ANYTRA;
  81. END $$
  82.  
  83. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)