2013-01-07 102 views
13

问题提示!当我拼写正确时,问题就消失了!在MySQL存储过程中创建的临时表的范围

我有一个MySQL存储过程,它创建一个临时表。当我从mysql提示符调用过程时,它似乎运行成功,但是如果我从临时表中选择COUNT(*),则会出现一个错误消息,指出该表不存在。

在存储过程结束时,存储过程中创建的临时表是否会停止存在?

mysql> delimiter // 
mysql> drop procedure if exists sp_temp_reciepts// 
mysql> create procedure sp_temp_receipts() 
begin 
    drop temporary table if exists receipts; 
    create temporary table receipts 
    ( ... snip ... 
); 
    insert into receipts 
    select ... snip ... 
end// 
mysql> delimiter ; 
mysql> call sp_temp_reciepts(); 
Query OK, 46903 rows affected, 1 warning (2.15 sec) 
mysql> select count(*) from receipts; 
ERROR 1146 (42S02): Table 'receipts' doesn't exist 
+0

不,它仍然存在。你可以在这里包含代码吗?如果存在// 创建过程sp_temp_receipts sp_temp_reciepts – ethrbunny

+0

分隔符// 下降过程() 开始 – user1956095

+0

请编辑您原来的职位,包括代码。 – ethrbunny

回答

13

这个问题已经过了一年多了。它值得回答。这里是:

我刚才在DBA StackExchange中看到这个问题:How long will a temporary MEMORY table persist if I don't drop it (MySQL)。我只是回答了。在某种程度上我这样说:

根据the Book

kdsjx

第5章有一个副标题返回结果集到另一个存储过程

它说在第2段上的页面117:

不幸的是,只有这样才能通过从一个存储过程设置为另一个结果是经由一个临时表来传递的结果。这是一个尴尬的解决方案b,并且 - 因为临时表在整个会话中都有范围 - 它会创建许多与使用全局变量相同的可维护性问题。但如果一个存储的程序需要提供另一个存储的程序和结果,那么临时表可能是最好的解决方案。

虽然由于拼写错误而导致问题被删除,但所有调用MySQL存储过程的人都需要表达和学习这个观点,并且需要他们的数据。

相关问题