2014-01-20 36 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。

相关问题