[英]How to understand a mysql temporary table already exists in a stored procedure?
我使用mysql临时表在几个存储过程之间共享一些中间数据。 所有这些过程都使用单个数据库连接。 在每个 SP 中,我需要确定一个 mysql 临时表是否已经存在。 如果它已经存在,那么我将使用它的值,否则 SP 将创建并填充临时表,其他 SP(当然在同一连接上!)将使用临时表结果。
但我不知道我应该如何检查临时表是否已经存在,我的意思是这样的:
IF temporaryTablename EXISTS THEN
...
ELSE
...
END IF;
任何的想法?
创建表时,它具有 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 ;
更新
...
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;
...
出于某种原因,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。
这也是一种解决方法,但对我来说效果很好。 它也适用于临时表。
我用这个:
CREATE FUNCTION `TableExists`(tableName text) RETURNS bit(1)
DETERMINISTIC
BEGIN
return (SELECT count(*) FROM information_schema.tables where table_name = tableName and table_schema=schema() limit 1) > 0;
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.