Los nombres de las tablas tienen prioridad sobre los nombres asignados a las variables.
Pudiera decirse:
- Tabla mata a campo.
- Campo mata a variable.
En síntesis:
No uses los mismos nombres para diferentes objetos o de lo contrario los resultados serán erráticos.
Además, mira bien el manual de referencia en el tema de procedimientos almacenados. Estás tratando de crear una traza de tabla por registro, cuando ya existen en MySQL sentencias y métodos mucho más eficientes para hacer el trabajo.
Me refiero puntualmente a esto:
Código:
WHILE actual < total DO
SELECT conductor INTO dni FROM vacdestra LIMIT actual,1;
SELECT COUNT(*) INTO vac FROM vacdestra WHERE conductor=dni AND actividad="V";
SELECT COUNT(*) INTO tra FROM vacdestra WHERE conductor=dni AND actividad="T";
SELECT COUNT(*) INTO des FROM vacdestra WHERE conductor=dni AND actividad="D";
INSERT INTO tabla VALUES ( tra , des , vac );
SET actual = actual + 1;
END WHILE;
Esto está
mal, se hace de otra forma. Mirá este link:
19.2.11. Cursores
Como consejo, no hagas trazados donde puedas resolver con consultas...
Imaginate algo así:
Código:
INSERT INTO tabla
SELECT
conductor,
SUM(IF(actividad='V',1,0)),
SUM(IF(actividad='T',1,0)),
SUM(IF(actividad='D',1,0))
FROM vacdestra
GROUP BY conductor;
Eso debería hacer:
- 1 full scan.
- Agrupar por conductor.
- Sumar 1 por cada coincidencia en cada comparación por cada registro leído.
- Insertar cada registro resultante en la tabla nueva.