mysql - 在存储过程中创建临时表

标签 mysql stored-procedures

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

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

如果我在存储过程之外手动创建一个普通表,那么存储过程不会创建临时表,而是创建存储过程并完全按照我的要求进行操作。

如果我随后将创建临时表添加到存储过程,则 MySQL Workbench 会显示意外结束和创建语句的 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 ; 

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

最佳答案

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

DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

(强调我的)

喜欢以下内容:

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 - 在存储过程中创建临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47444231/

相关文章:

sql-server - 从 sql 存储过程中的逗号分隔字符串中删除值

sql - 您可以使用 CASE 语句来评估您传递给存储过程的参数吗?

MySQL - 如何使用列约束声明主键?

mysql - 在 MySQL 5.7 中使用 `Max()` 和 `GROUP BY`

mysql - "AttributeError: ' str ' object has no attribute ' 光标"

php - 如何在mysql数据库上为复选框数组中的每个值选择值

java - 使用 Spring Data JPA 运行存储过程时出现问题 - SQLServerException : The column name id is not valid

mysql - 将第二行移动到第一行,之后所有记录都遵循 SQL 中相同的顺序

asp.net - 如何让 MySQL 过程返回 bool 值?

mysql - MySQL非法混合排序规则