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
4

1 回答 1

16

这个问题已经有一年多了。它值得一个答案。它是这样的:

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

根据

kdsjx

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

它在第 117 页的第 2 段中说:

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

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

于 2014-01-31T16:13:55.460 回答