Claro, es que yo pensaba que se iba a comportar como una variable, que cada vez que llamas al procedimiento seria como crear un proceso nuevo, y con las variables vacias (y las tablas).
 
Creo que no me explico bien :(. El error esta en la linea del INSERT linea DENTRO del SP donde se define la tabla temporal: 
  CREATE TEMPORARY TABLE idsHer (
    idHerramienta INT PRIMARY KEY
  );
  INSERT INTO idsHer VALUES (idHer);
  SET rows = ROW_COUNT();
  WHILE rows > 0 DO
    INSERT IGNORE INTO idsHer 
      SELECT DISTINCT Herramientas_idHerramientaNecesaria
      FROM Herramientas AS e
      INNER JOIN idsHer AS p ON e.idHerramienta = p.idHerramienta WHERE Herramientas_idHerramientaNecesaria IS NOT NULL;
    SET rows = ROW_COUNT();
  END WHILE;   
Quizas esa operacion no se pueda realizar como quiero. Se supone que quiero que en idsHer esten los id de una relacion recursiva. Por ej:
     herramienta herramienta-padre
       1                   NULL 
       2                   1
       3                   2
       4                   NULL 
Al llamar a este SP me devuelve: 
    CALL sp(3):              CALL sp(2):              CALL sp(4): 
        3                                    2                              4
        2                                    1
        1 
De momento creando una tabla normal me funciona, pero el problema es que al hacer varias CALL sp, CALL sp, CALL sp, CALL sp... a la vez, como me has dicho comparte la tabla idsh, vamos que es una tabla mas, y no vale. Hasta ahora la creaba siempre al principio y luego la borraba pero claro, segun lo que veo esta mal el planteamiento. 
Concluyendo: Con una tabla normal, me falla al ejecutar dos veces a la vez el SP, con una tabla temporal, la consulta dentro del while no va. Hare algunas pruebas mas a ver... 
¡Al final lo hago en php!

jeje. Gracias por tu paciencia. 
Saludos