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

Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecutas 2 veces

Estas en el tema de Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecutas 2 veces en el foro de Mysql en Foros del Web. Hola, tengo un procedimiento que necesita crear una tabla temporal. La defino de esta manera: CREATE TABLE idsH ( id INT PRIMARY KEY ) ENGINE=MEMORY; ...
  #1 (permalink)  
Antiguo 08/01/2009, 02:29
 
Fecha de Ingreso: noviembre-2008
Mensajes: 74
Antigüedad: 15 años, 4 meses
Puntos: 0
Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecutas 2 veces

Hola, tengo un procedimiento que necesita crear una tabla temporal. La defino de esta manera:

CREATE TABLE idsH (
id INT PRIMARY KEY
) ENGINE=MEMORY;

-- uso de la tabla
DROP TABLE idsH

Este procedimiento se llama desde otro, pero parece que hay problemas con la tabla: ERR: Table 'cidaut_prg.idsHer' doesn't exist.

¿Parece que si lo borras desde un procedimiento la tabla idsH se borra para todos? He probado con CREATE TEMPORARY TABLE idsH pero en este caso muestra el error ERROR 1137 (HY000): Can't reopen table: 'idsH.

Como genero una tabla para ese procedimimento y que no haya conflicto al ejecutarlo varias veces?

Gracias a todos

Buenos dias
  #2 (permalink)  
Antiguo 08/01/2009, 04:27
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: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

Simple: No debes borrar la tabla hasta que se terminen todas las tareas que se realizan con ella.

Una sentencia DROP es una sentencia de tipo DDL, y estas son, para MySQL, irreversibles. Una sentencia DROP tiene un efecto inmediato y tiene un COMMIT implícito, lo que significa que este opera aunque haya SAVEPOINT o transacciones definidos.

Además, no es una tabla temporal lo que estás usando, sino una tabla física. Una tabla temporal se define con un CREATE TEMPORARY TABLE, y tiene existencia solamente mientras el Store Procedure se ejecuta. Al terminar la tabla desaparece sola.
__________________
¿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 08/01/2009, 05:12
 
Fecha de Ingreso: noviembre-2008
Mensajes: 74
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

Si si, lo que pasa es que me interesa lo que tiene la tabla solo dentro del procedimiento. Cuando ejecuto de nuevo el procedimiento me gustaria que la tabla estuviese vacia (aunque haya otro procedimiento en ejecucion).

Voy echando un vistazo a TEMPORARY que se supone que funciona como quiero, veo que:

mysql> drop table idsHer;
ERROR 1051 (42S02): Unknown table 'idsHer'
vale, la tabla antes no existe.

En el procedimiento la defino asi ahora:
-> CREATE TEMPORARY TABLE idsHer (
-> idHerramienta INT PRIMARY KEY
-> );
Despues, al ejecutar el procedimiento no se porque sale:
ERROR 1137 (HY000): Can't reopen table: 'idsHer'
Con idsHer lo que hago es un insert into y despues select count():
INSERT IGNORE INTO idsHer
SELECT DISTINCT Herramientas_idHerramienta
FROM Herramientas AS e
INNER JOIN idsHer A.................

SELECT count(idHerramienta) INTO numtother FROM idsHer;

Voy a buscar algunos ejemplos mas, porque no se que esta mal.

Gracias gnzsoloyo
  #4 (permalink)  
Antiguo 08/01/2009, 06:19
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: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

Hay un problema de lógica en tu planteo:
Si tienes dos procesos concurrentes que escriben en una sola tabla, tendrás problemas serios de consistencia de datos.
Por otro lado, si un proceso la está usando, es imposible que ejecutes otro proceso y la encuentres vacía.
La única forma de hacer eso, es usando dos tablas.

En cuanto a tu error es simple: Las tablas TEMPORARY solo operan dentro de los STORE PROCEDURES. No desde afuera de ellos.
__________________
¿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/01/2009, 07:30
 
Fecha de Ingreso: noviembre-2008
Mensajes: 74
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

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
  #6 (permalink)  
Antiguo 09/01/2009, 09:31
 
Fecha de Ingreso: julio-2008
Mensajes: 40
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

ademas no hace falta borrarla, si no me equivoco, se borra sola al terminar la ejecucion del script?
  #7 (permalink)  
Antiguo 11/01/2009, 07:31
 
Fecha de Ingreso: noviembre-2008
Mensajes: 74
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemilla cuando creas una tabla temporal en un procedimiento y lo ejecu

Hola kronenmix, la verdad es que a mi no se me borra. Buscare un ejemplo de SP en el que se cree una tabla, a ver si encuentro alguno que funcione bien.


Gracias
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 21:56.