私はmysqlにプロシージャを持っており、いくつかの時間ごとにそれを呼び出して、動作している多数のデバイスに対して毎日1時間ごとにスロットのテーブルを作成したいと考えています。表形式はこんな感じ
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_dev_slot
。通常、テーブルの名前の形式は次のとおりです:など プロシージャはsetX_devices
、setX_dev_slot
毎日 1600 から 0100 までの 1 時間ごとにレコードを追加する必要があり、必要な量を追加するためにいくつかの引数を指定して呼び出すだけです。現在の手順は次のとおりです
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 ;
したがって、私の問題は、これを変更して、必要なテーブル (セット) に追加したり、後で追加したりすることです。だから私はこれを試してみましたが、問題があり、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 ;
arena
は、パラメーターとして渡すテーブルの名前 (つまりset1_dev_slot
、set2_dev_slot
など) であり"
、@sql_text
. の時間の部分の近くにエラーが存在し、どこにも何もない場合date()
の近くのエラーについて何も言わない''
''
ところで、テーブルを作成して行を取得するだけでなく、mysqlで何かを行うのはこれが初めてなので、コメントをいただければ幸いです。私は、より伝統的なプログラミングの考え方(C C ++など)に大きく影響されていることを最初に認めます。