Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中创建临时表时出现问题_Mysql_Stored Procedures_Mariadb_Xojo - Fatal编程技术网

在mysql中创建临时表时出现问题

在mysql中创建临时表时出现问题,mysql,stored-procedures,mariadb,xojo,Mysql,Stored Procedures,Mariadb,Xojo,我想在Mysql中创建一个存储过程,删除某个临时表(如果存在),然后在数据库“prs1”中创建这个临时表 我创建的过程如下: CREATE PROCEDURE `CrearTablaTemporal`(table_name VARCHAR(100)) BEGIN SET @TablaTemporal = table_name; SET @sql_query1 = CONCAT('DROP temporary table if exists ',@TablaTemporal

我想在Mysql中创建一个存储过程,删除某个临时表(如果存在),然后在数据库“prs1”中创建这个临时表

我创建的过程如下:

    CREATE PROCEDURE `CrearTablaTemporal`(table_name VARCHAR(100))
BEGIN
    SET @TablaTemporal = table_name;
    SET @sql_query1 = CONCAT('DROP temporary table if exists ',@TablaTemporal);
    PREPARE stmt1 FROM @sql_query1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    
    SET @sql_query2 = CONCAT('CREATE TEMPORARY TABLE IF NOT EXISTS prs1.',@TablaTemporal,' (ean13 VarChar(13)) Engine=MyISAM');
    PREPARE stmt2 FROM @sql_query2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END
执行存储过程时,不会出现错误,但如果执行以下SQL语句,它会告诉我该表不存在:

当我从我的项目(在Xojo中创建)中执行存储过程时,我没有得到任何错误,但我不知道如何检查它是否是完美创建的,因为它是由Navicat、Valentina Studio等程序创建的。当我检查数据库时,表不存在。 问题是,如何保持表打开、插入值和检索查询?。我自己解释说,在我关闭应用程序之前,我的应用程序一直永久地打开与数据库的连接。在我的方法中,我启动事务,执行创建临时表的语句(由于存储过程),然后完成事务。我没有关闭与数据库的连接,但是我不知道如何维护表

请问我该怎么解决呢

多谢各位。
Sergio

临时表仅在创建它们的会话中可用。一旦连接终止,就会删除临时表

使用临时表的一个常见用例是测试框架,您可以使用临时表来避免进一步的清理

第1场会议:

mysql> delimiter !!
mysql> CREATE PROCEDURE CreateTable(table_name VARCHAR(100))
    -> BEGIN
    ->   SET @a:= CONCAT("CREATE OR REPLACE TEMPORARY TABLE ", table_name, " (a int)");
    ->   EXECUTE IMMEDIATE @a;
    -> END!!
Query OK, 0 rows affected (0,01 sec)

mysql> delimiter ;
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4118 |
+-----------------+
1 row in set (0,00 sec)

mysql> describe foobar;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0,00 sec)
第2次会议:

mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4119 |
+-----------------+
1 row in set (0,01 sec)

mysql> describe foobar;
ERROR 1146 (42S02): Table 'test.foobar' doesn't exist

因此,如果您需要检查临时表的完整性或内容,您需要在同一个连接内或使用非临时表进行检查。

最后,在所有写信给我的人的帮助下,我找到了解决方案。我在Xojo中编程,因此对数据库的查询是通过这个程序进行的。在Georg的帮助下,我意识到临时表只存在于该会话中,如果关闭它,临时表将被删除。这就是我解决问题的方法

我使用以下步骤创建了一个方法:

//启动事务

DB.SQLExecute("START TRANSACTION")
DB.CommitTransaction
//如果临时表存在,请删除它;如果不存在,我们将创建它。

我们必须使用以下两个SQL语句:

'DROP temporary table if exists @TemporalTable'
'CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))
//可选:检查创建的时间表是否存在(见下文)

//将值插入临时表中

Dim stmSQL As String 
DB.SQLExecute("START TRANSACTION")

stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"

Dim ps As MySQLPreparedStatement = DB.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox DB.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute

DB.Commit
Return Not DB.Error
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )
DROP temporary table if exists 'Temporary Table
//根据时间表恢复咨询结果

Dim stmSQL As String 
DB.SQLExecute("START TRANSACTION")

stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"

Dim ps As MySQLPreparedStatement = DB.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox DB.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute

DB.Commit
Return Not DB.Error
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )
DROP temporary table if exists 'Temporary Table
//删除临时表

Dim stmSQL As String 
DB.SQLExecute("START TRANSACTION")

stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"

Dim ps As MySQLPreparedStatement = DB.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox DB.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute

DB.Commit
Return Not DB.Error
Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )
DROP temporary table if exists 'Temporary Table
//完成交易

DB.SQLExecute("START TRANSACTION")
DB.CommitTransaction
为了检查和验证临时表是否存在,我在MySQL数据库中创建了一个“存储过程”,其代码如下:

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
Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database
然后从Xojo,我们只需使用以下代码调用该过程:

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
Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database
并执行以下SQL查询:

Dim stmSQL As String = "SELECT @table_exists"
Return DB.SQLSelect(stmSQL)
如果结果为“1”,则表已创建并存在;如果为“0”,则该表不存在

我希望这能帮助别人。。。就我而言,这是纯粹的自我学习

问候,
塞尔吉奥

删除和创建是有区别的。创建表时,您将给出一个schemaname prs1。这是正确的吗?这是正确的,但我包含了数据库的名称,以确认它是在prs1数据库中创建的。稍后我已经包括了DROP部分,我确实应该包括数据库的名称,但我感兴趣的是临时表的创建,我看不到临时表在会话范围内的存在。不幸的是,对于您来说,动态sql会话与您运行数据库的会话不同过程。非常感谢你,Georg,通过你的例子,我很清楚,如果我想使用时态表,我必须在同一个会话中做所有事情。我不知道你是否能给我一个答案,但我的项目有三个阶段:1.开始事务2.创建时态表3.提交事务对于你的例子,我必须把创建时态表,在步骤3结束之前插入值和检索查询,因为在步骤3结束时,表将被删除,对吗?事务是什么意思?您的临时表创建为MyISAM,它不支持事务。