Problemas para crear tabla temporal en MySQL

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:

  1. ‘DROP temporary table if exists @TablaTemporal
  2. ‘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, :sweat_smile: :sweat_smile:

Un saludo,
Sergio