在存储过程中创建临时表

Posted

技术标签:

【中文标题】在存储过程中创建临时表【英文标题】:Creating temporary table inside stored procedure 【发布时间】:2017-11-22 21:37:12 【问题描述】:

我正在为 mysql 编写我的第一个存储过程。

存储过程需要创建一个临时表,然后在其中插入一些数据。

如果我在存储过程之外手动创建一个普通表,那么存储过程不会创建存储过程创建的临时表,并且完全符合我的要求。

如果我随后将创建临时表添加到存储过程中,MySQL 工作台将显示意外结束和创建语句的 en。

下面是我的存储过程

    DELIMITER //
    CREATE PROCEDURE getLast24Hours()
    BEGIN
#End of the below line I get unexpected end without this it works fine
        CREATE TABLE hours (`Hour` VARCHAR(8) NOT NULL, `Value` INT NOT NULL DEFAULT 0, PRIMARY KEY(`Hour`)); 

        DECLARE crt_time VARCHAR(8);
        DECLARE counter INT;
        DECLARE currentTime DATETIME;

        SET currentTime = NOW();

        SET crt_time = DATE_FORMAT(currentTime, '%d-%m %H');
        SET counter = 0;
        WHILE counter < 23 DO
            INSERT INTO hours (`Hour`) VALUES (crt_time);
            SET currentTime = currentTime - INTERVAL 1 HOUR;
            SET crt_time = DATE_FORMAT(currenttime, '%d-%m %H');
            SET counter = counter + 1;
        END WHILE;
    END //
    DELIMITER ; 

我看不出有什么可以说创建临时表是不可能的,所以我做错了什么。

【问题讨论】:

“MySQL 工作台然后显示意外结束和 create 语句的 en。” 您能否编辑它以引用准确的错误、位置等?这个措辞不清楚。 【参考方案1】:

https://dev.mysql.com/doc/refman/5.7/en/declare.html 说:

DECLARE 只能在 BEGIN ... END 复合语句中使用,并且必须位于其开头,在任何其他语句之前。

(强调我的)

如下:

CREATE PROCEDURE getLast24Hours()
    BEGIN
        DECLARE crt_time VARCHAR(8);
        DECLARE counter INT;
        DECLARE currentTime DATETIME;

        CREATE TABLE hours (`Hour` VARCHAR(8) NOT NULL, `Value` INT NOT NULL DEFAULT 0, PRIMARY KEY(`Hour`)); 

【讨论】:

我没有意识到不允许在存储过程中间声明这么麻烦。这样就解决了。感谢您的帮助

以上是关于在存储过程中创建临时表的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 存储过程中创建临时表

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

在SQL存储过程中创建临时表

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时表已满

怎样在pl/sql中创建,执行和删除存储过程