2014-10-30 130 views
1

我繼承了一些使用存儲過程的代碼,其中一個代碼看起來沒有正常工作。在MySQL中找不到存儲過程中的臨時表

存儲過程使用臨時表稍後在過程中插入數據。但是,當我執行存儲過程時,不會插入任何數據。當我調試它,我得到的錯誤:

Table 'db.testtable' doesn't exist

我剝了下來存儲過程到下面的代碼,這是行不通的。我總是在SELECT語句中得到錯誤。基於我所見過的例子,所有內容都可以看出來。

DROP PROCEDURE IF EXISTS db.insert_record; 
CREATE PROCEDURE db.`insert_record`(id int, status int) 
BEGIN 
    DECLARE code varchar(45); 

    DROP TEMPORARY TABLE IF EXISTS testTable; 

    CREATE TEMPORARY TABLE testTable AS (SELECT 'TEST' AS fakeColumn); 

    SELECT fakeColumn INTO code FROM testTable; 
END; 

我也驗證了我連接的用戶具有創建臨時表的權限;事實上,它具有可

其他細節

在Windows上運行的MySQL 5.6許可每次。

如果我自己拿掉drop/create/select語句並作爲腳本運行,它的行爲與預期相同。

使用Toad for MySQL來調試存儲過程。

+0

原來,這個問題是不是代碼問題,而是一個工具的問題。我在整個存儲過程中添加了select語句,並返回臨時表的結果。 由於某些原因,Toad for MySQL無法處理臨時表的調試。一旦我確定了,我發現在存儲過程的insert語句中存在一個問題。 – drneel 2014-10-31 13:43:47

+0

我們在相同的環境中也遇到同樣的錯誤。在我們的例子中,這不是每次,有時它都有效,有時它給出錯誤表'table_name'不存在。在我們的sp中,我們正在下降並在適當的位置創建臨時表(這在以前的mysql版本5.5中起作用),並且這個sp在循環中被多次調用。 – Anil 2014-11-17 13:29:11

回答

0

我無法重現該問題。你可以提供哪些其他信息?

mysql> USE `test`; 
Database changed 

mysql> SELECT VERSION(); 
+-----------------+ 
| VERSION()  | 
+-----------------+ 
| 5.5.22-0ubuntu1 | 
+-----------------+ 
1 row in set (0.00 sec) 

mysql> DELIMITER // 

mysql> DROP PROCEDURE IF EXISTS `insert_record`// 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE PROCEDURE `insert_record`(`id` int, `status` int) 
    -> BEGIN 
    -> DECLARE `code` VARCHAR(45); 
    -> DROP TEMPORARY TABLE IF EXISTS `testTable`; 
    -> CREATE TEMPORARY TABLE `testTable` AS (SELECT 'TEST' AS `fakeColumn`); 
    -> SELECT `fakeColumn` INTO `code` FROM `testTable`; 
    -> SELECT `code`; 
    -> END// 
Query OK, 0 rows affected (0.01 sec) 

mysql> CALL `insert_record`(NULL, NULL)// 
+--------+ 
| `code` | 
+--------+ 
| TEST | 
+--------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

SQL Fiddle demo