Buenos días,
por si alguien está tan perdido como yo o le surge la necesidad de utilizar una tabla temporal, os cuento cómo he resuelto finalmente mi problema. El caso es que como me comentó @Mauricio_Pulla si se cierra la conexión, la tabla se pierde. Lo que he hecho ha sido crear un método como este:
// Empezamos la transacción
BBDD.SQLExecute(“START TRANSACTION”)
// Borramos la tabla temporal si existe y sino la creamos.
Debemos utilizar estas dos sentencias SQL:
- ‘DROP temporary table if exists @TablaTemporal’
- ‘CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))’
// OPCIONAL: comprobar si existe la tabla temporal creada (ver más abajo)
// Insertamos los valores que queramos en la tabla temporal
Dim stmSQL As String
BBDD.SQLExecute("START TRANSACTION")
stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"
Dim ps As MySQLPreparedStatement = BBDD.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox BBDD.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute
BBDD.Commit
Return Not BBDD.Error
//Recuperamos los resultados de la consulta frente a la tabla temporal
Dim stmSQL As String = “SELECT * FROM @TablaTemporal”
Return BBDD.SQLSelect( stmSQL )
//Eliminamos la tabla temporal
‘DROP temporary table if exists @TablaTemporal’
// Terminamos la transacción
BBDD.CommitTransaction
Para comprobar y verificar si existe la tabla temporal, he creado un “stored procedure” en la base de datos de MySQL que tiene este código:
CREATE PROCEDURE
check_table_exists
(table_name VARCHAR(100))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘42S02’ SET @err = 1;
SET @err = 0;
SET @table_name = table_name;
SET @sql_query = CONCAT('SELECT 1 FROM ',@table_name);
PREPARE stmt1 FROM @sql_query;
IF (@err = 1) THEN
SET @table_exists = 0;
ELSE
SET @table_exists = 1;
DEALLOCATE PREPARE stmt1;
END IF;
END
Entonces desde Xojo solo tenemos que llamar al procedimiento con este código:
Dim stmSQL As String = “CALL check_table_exists(‘@TablaTemporal’)”
BBDD.ExecuteSQL(stmSQL)
Y ejecutar esta consulta SQL:
Dim stmSQL As String = “SELECT @table_exists”
Return BBDD.SQLSelect(stmSQL)
Si el resultado es ‘1’, la tabla se ha creado y existe; y si es ‘0’, la tabla no existe.
Espero que esto pueda ayudar a alguien… en mi caso fue por puro autoaprendizaje,
Un saludo,
Sergio