MySQL准备并执行过程中的语句

MySQL准备并执行过程中的语句,mysql,Mysql,我在mysql中有一个过程,我希望每隔一段时间调用它,为每天每小时工作的多个设备填充一个插槽表。表格格式如下 CREATE TABLE IF NOT EXISTS set1_dev_slot ( id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, device TINYINT UNSIGNED NOT NULL,

我在mysql中有一个过程,我希望每隔一段时间调用它,为每天每小时工作的多个设备填充一个插槽表。表格格式如下

CREATE TABLE IF NOT EXISTS set1_dev_slot
(
id                 MEDIUMINT UNSIGNED                      NOT NULL AUTO_INCREMENT,
device             TINYINT UNSIGNED                        NOT NULL,
dev_date           DATE                                    NOT NULL,
dev_time           TIME                                    NOT NULL,
status             ENUM('FREE','PENDING','RESERVED')       NOT NULL DEFAULT 'FREE',
dev_type           ENUM('FIN','CHAL','NONE')               NOT NULL DEFAULT 'NONE',

PRIMARY KEY (id),
UNIQUE (device,dev_date,dev_time),

CONSTRAINT fk_device FOREIGN KEY (device) REFERENCES device (id)
);
因此,我有一个用于一组设备的表,我将其命名为
set1\u dev\u slot
。通常,选项卡具有以下名称格式:
setX\u设备
setX\u设备插槽
e.t.c。 这个过程必须为每天从1600到0100的每小时添加记录,我只是用一些参数来调用它来添加我想要多少。目前的程序如下

delimiter //
CREATE PROCEDURE populateSlots (IN currentDateTime DATETIME, IN periodInDays INT)
BEGIN
    DECLARE iterDateTime DATETIME DEFAULT currentDateTime;
    DECLARE numDevices INT;
    SELECT COUNT(*) INTO numDevices FROM set1_devices;

    WHILE DATEDIFF(iterDateTime, currentDateTime) < periodInDays DO
    BEGIN
        DECLARE device_iter INT DEFAULT 1;

        WHILE device_iter < numDevices + 1 DO
            INSERT INTO set1_dev_slot (device,dev_date,dev_time) VALUES (device_iter, DATE(iterDateTime), TIME(iterDateTime));
            SET device_iter = device_iter + 1;
        END WHILE;

        SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 1 HOUR);
        IF TIME(iterDateTime) = "02:00:00" THEN
            SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 14 HOUR);
        END IF;
    END;
    END WHILE;

    BEGIN
        DECLARE device_iter INT DEFAULT 1;

        WHILE device_iter < numDevices + 1 DO
            INSERT INTO set1_dev_slot (device,dev_date,dev_time) VALUES (device_iter, DATE(iterDateTime), TIME(iterDateTime));
            SET device_iter = device_iter + 1;
        END WHILE;

        SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 1 HOUR);
        SET device_iter = 1;

        WHILE device_iter < numDevices + 1 DO
            INSERT INTO set1_dev_slot (device,dev_date,dev_time) VALUES (device_iter, DATE(iterDateTime), TIME(iterDateTime));
            SET device_iter = device_iter + 1;
        END WHILE;
    END;

END;//
delimiter ;
分隔符//
创建过程PopulateSlot(在currentDateTime DATETIME中,在periodInDays INT中)
开始
声明iterDateTime日期时间默认值currentDateTime;
声明numDevices INT;
从set1_设备中选择COUNT(*)进入numDevices;
而DATEDIFF(iterDateTime,currentDateTime)
所以我的问题是,我想将它更改为添加到我想要和/或以后添加的任何表(集合)。 所以我尝试了这个,但它提出了一个问题,mysql没有太多的帮助

delimiter //
CREATE PROCEDURE populateSlots (IN currentDateTime DATETIME, IN periodInDays INT, IN arena VARCHAR(32))
BEGIN
DECLARE iterDateTime DATETIME DEFAULT currentDateTime;
DECLARE numDevices INT DEFAULT 5;


WHILE DATEDIFF(iterDateTime, currentDateTime) < periodInDays DO
BEGIN
    DECLARE device_iter INT DEFAULT 1;

    WHILE device_iter < numDevices + 1 DO
        SET @sql_text = concat('INSERT INTO ', arena, ' (device,dev_date,dev_time) VALUES (',device_iter,', DATE("',iterDateTime,'"), TIME("',iterDateTime,'");');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET device_iter = device_iter + 1;
    END WHILE;

    SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 1 HOUR);
    IF TIME(iterDateTime) = "02:00:00" THEN
        SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 14 HOUR);
    END IF;
END;
END WHILE;

BEGIN
    DECLARE device_iter INT DEFAULT 1;

    WHILE device_iter < numDevices + 1 DO
        SET @sql_text = concat('INSERT INTO ', arena, ' (device,dev_date,dev_time) VALUES (',device_iter,', DATE("',iterDateTime,'"), TIME("',iterDateTime,'");');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET device_iter = device_iter + 1;
    END WHILE;

    SET iterDateTime = DATE_ADD(iterDateTime, INTERVAL 1 HOUR);
    SET field_iter = 1;

    WHILE device_iter < numDevices + 1 DO
        SET @sql_text = concat('INSERT INTO ', arena, ' (device,dev_date,dev_time) VALUES (',device_iter,', DATE("',iterDateTime,'"), TIME("',iterDateTime,'");');
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        SET device_iter = device_iter + 1;
    END WHILE;
END;

END;//
delimiter ;
分隔符//
创建过程PopulateSlot(在currentDateTime DATETIME中,在periodInDays INT中,在arena VARCHAR(32))中)
开始
声明iterDateTime日期时间默认值currentDateTime;
声明numDevices INT DEFAULT 5;
而DATEDIFF(iterDateTime,currentDateTime)
arena
是我作为参数传递的表的名称(即
set1\u dev_slot
set2\u dev_slot
e.t.c.),我在
@sql\u text
的日期和时间函数中尝试使用和不使用
。在
日期()的小时部分附近出现错误
and without表示在
'
附近没有任何
'
时出现错误


我们将非常感谢你的评论,因为这是我第一次在MySQL中做的事情比创建表和检索行更重要,我将首先承认我受到更高级的编程思维(C C++等)的很大影响。

听起来您的数据结构可能需要进一步改进。事实上,您可能会发现,使用一个这样的表,其中包含一列,指示指向哪个“设备集”,而不是将您的时间间隔分布在每个“设备集”的不同类似结构的表中,这会更容易"每个记录都是相关的。是的,你可能是对的……我当时想的是同一件事,但……我认为我倾向于把事情清楚地组织在自己的地方,或者……创建一个类,现在我想到了不同的实例。就像我第一次使用数据库时说的,我不确定思考的方式,所以我很欣赏我在维基百科上读到了那篇文章。谢谢。