簡體   English   中英

如何理解存儲過程中已經存在一個mysql臨時表?

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

SQL 小提琴演示

更新

...
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM