[英]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.