2014-01-20 64 views
4

我使用mysql臨時表來共享幾個存儲過程之間的一些中間數據。所有這些過程都使用單個數據庫連接。 在每個SP中,我需要確定一個mysql臨時表是否已經存在或不存在。如果它已經存在,那麼我將使用它的值,否則SP將創建&填充臨時表&其他SP(當然在同一連接!)將使用臨時表結果。如何理解一個存儲過程中已經存在的mysql臨時表?

但我不知道我應該怎麼檢查,如果臨時表已經存在或不是,我的意思是這樣的:

IF temporaryTablename EXISTS THEN 
    ... 
ELSE 
    ... 
END IF; 

什麼想法?

+0

我會試着在表上嘗試DESCRIBE並檢查返回的sqlcode(認爲可以在存儲過程中完成)。不知道您是否創建了/如果不存在,您是否得到不同的sqlcode取決於是否創建了表。 – Kickstart

回答

4

它創建表時有IF NOT EXISTS(13.1.17. CREATE TABLE Syntax)選項,您可以在這種情況下使用。

例子:

DELIMITER $$ 

CREATE PROCEDURE `temp_sp1`() 
BEGIN 
    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` (
     `col2` int(11) DEFAULT NULL, 
     `col3` int(11) DEFAULT NULL 
    ); 
    INSERT INTO `temp_table` (`col2`, `col3`) VALUES (4, 5); 
    SELECT `col2`, `col3` FROM `temp_table`; 
END$$ 

DELIMITER ; 

SQL Fiddle demo

UPDATE

... 
DECLARE `no_such_table` TINYINT(1) DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42S02' SET `no_such_table` := 1; 
DO (SELECT NULL FROM `temp_table` LIMIT 0); 
IF (`no_such_table`) THEN 
    ... 
ELSE 
    ... 
END IF; 
... 
+0

這不是我的答案的問題,我想插入值只有當表已經不存在,但在這裏你不提供任何方式來檢查它 –

+0

@EhsanKhodarahmi:我絕對不明白你的問題。我希望更新可以提供幫助。 – wchiquito

2

出於某種原因wchiquito的UPDATE對我來說是不行的,所以我修改成這樣:

CREATE PROCEDURE check_table_existence (IN table_name CHAR(64)) 
BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1; 
    SET @err = 0; 
    SET @table_name = table_name; 
    SET @sql_query = CONCAT('SELECT NULL FROM ',@table_name); 
    PREPARE stmt1 FROM @sql_query; 
    IF (@err = 1) THEN 
     SET @table_exists = 0; 
    ELSE 
     SET @table_exists = 1; 
     DEALLOCATE PREPARE stmt1; 
    END IF; 
END 

然後:

CALL check_table_existence('existent_table'); 
SELECT @table_exists; 

給出

+---------------+ 
| @table_exists | 
+---------------+ 
|    1 | 
+---------------+ 

,否則爲0。

這也是一種解決方法,但它對我來說工作正常。 它也適用於TEMPORARY TABLE。

相關問題