在MySQL存储过程中创建的临时表的范围

时间:2013-01-07 20:15:48

标签: mysql stored-procedures temp-tables

问题撤回!当我正确拼写所有内容时,问题就会消失!

我有一个创建临时表的MySQL存储过程。当我从mysql提示符调用该过程时,它似乎成功运行,但如果我从临时表中选择SELECT 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

1 个答案:

答案 0 :(得分:16)

这个问题已有一年多了。值得一个答案。在这里:

我今天刚刚在DBA StackExchange中看到了这个问题:How long will a temporary MEMORY table persist if I don't drop it (MySQL)。我刚回答在第一部分,我说:

根据the Book

kdsjx

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

在第117页的第2段中说:

  

不幸的是,将结果集从一个存储过程传递到另一个存储过程的唯一方法是通过临时表传递结果。这是一个尴尬的解决方案b,并且 - 因为临时表在整个会话中都有范围 - 它会产生许多与使用全局变量引起的相同的可维护性问题。但是如果一个存储的程序需要提供另一个带有结果的存储程序,那么临时表可能是最好的解决方案。

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

相关问题