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

15

问题已撤回!当我拼写一切正确时,问题消失了!

我有一个创建临时表的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

不是的,它还在那里。你能把代码包含在这里吗? - ethrbunny
删除存储过程如果存在 sp_temp_reciepts // 创建存储过程 sp_temp_receipts () 开始 - user1956095
请编辑您的原始帖子并包含代码。 - ethrbunny
1
你的SP中拼写混乱。recieptsreceipts混用。 - favoretti
简而言之,该表将继续存在。只需运行 drop procedure if exists f(); delimiter $ create procedure f()begin drop temporary table if exists t; create temporary table t select 1; select*from t; end$ delimiter ; call f(); select count(*)from t; - Pacerier
1个回答

16

这个问题已经超过一年了,它值得一个答案。以下是答案:

今天我在DBA StackExchange上看到了这个问题:如果我不删除MySQL中的临时MEMORY表,它会持续多久。我刚回答了它。其中一部分我说:

根据这本书

kdsjx

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

第117页第2段说:

不幸的是,将结果集从一个存储过程传递到另一个存储过程的唯一方法是通过临时表传递结果。这是一个棘手的解决方案,并且--由于临时表在整个会话期间具有作用域--它创建了许多与使用全局变量引起的可维护性问题相同的问题,但如果一个存储程序需要向另一个存储程序提供结果,则临时表可以是最佳解决方案。

尽管这个问题由于拼写错误而被删除,但所有调用MySQL存储过程并需要其数据可用的人都需要了解和学习这个观点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接