MYSQL程序将为 1.如果不存在,则创建类似于TABLE1的TABLE1_ARCHIVE 2.根据日期条件,将TABLE1中的值插入TABLE1_ARCHIVE 3.从TABLE1中删除这些记录。
链接到代码: https://paiza.io/projects/Eq7I5YGo-lt7_gu8wpQNdg?language=mysql
CREATE PROCEDURE ARCHIVE_EVENTS ( IN f_table VARCHAR(255),
IN t_table VARCHAR(255),
IN t_ts TIMESTAMP)
BEGIN
DECLARE c_sql VARCHAR(255);
DECLARE i_sql VARCHAR(255);
DECLARE d_sql VARCHAR(255);
SET @c_sql = CONCAT(' CREATE TABLE IF NOT EXISTS ', @t_table , ' LIKE ', @f_table );
PREPARE stmt FROM @c_sql;
EXECUTE stmt ;
SET @i_sql = CONCAT(' INSERT INTO ', @t_table, ' SELECT * FROM ', @f_table, ' WHERE `event_date` <= ', @t_ts);
PREPARE stmt FROM @i_sql;
EXECUTE stmt ;
COMMIT;
SET @d_sql = CONCAT(' DELETE FROM ', @f_table, ' WHERE `event_date` <= ', @t_ts);
PREPARE stmt FROM @d_sql;
EXECUTE stmt ;
COMMIT;
END;
CALL ARCHIVE_EVENTS ('TABLE1', 'TABLE1_ARCHIVE', now());
执行更改后,过程如下所示,仍然无效:
我得到的错误是
第2行的错误1064(42000):您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第3行的''附近使用正确的语法
CREATE PROCEDURE ARCHIVE_EVENTS (IN f_table VARCHAR(255),IN t_table VARCHAR(255),IN t_ts TIMESTAMP)
BEGIN
DECLARE c_sql VARCHAR(255);
DECLARE i_sql VARCHAR(255);
DECLARE d_sql VARCHAR(255);
SET c_sql = CONCAT(' CREATE TABLE IF NOT EXISTS ', t_table , ' LIKE ', f_table);
PREPARE stmt FROM c_sql;
EXECUTE stmt ;
SET i_sql = CONCAT(' INSERT INTO ', t_table, ' SELECT * FROM ', f_table, ' WHERE `event_date` <= ', t_ts);
PREPARE stmt FROM i_sql;
EXECUTE stmt ;
COMMIT;
SET d_sql = CONCAT(' DELETE FROM ', f_table, ' WHERE `event_date` <= ', t_ts);
PREPARE stmt FROM d_sql;
EXECUTE stmt ;
COMMIT;
END;
CALL ARCHIVE_EVENTS ('TEST', 'TEST_ARCHIVE', now());
答案 0 :(得分:1)
调整这样的过程并不困难只是放入一些select语句。注意@variables必须在预准备语句中使用,并且您没有引用日期t_ts。可能你没有设置分隔符。
drop procedure if exists p;
delimiter $$
CREATE PROCEDURE p (IN f_table VARCHAR(255),IN t_table VARCHAR(255),IN t_ts TIMESTAMP)
BEGIN
SET @c_sql = (select CONCAT(' CREATE TABLE IF NOT EXISTS ', t_table , ' LIKE ', f_table));
select @c_sql;
/*PREPARE stmt FROM @c_sql;
EXECUTE stmt ;
deallocate prepare stmt;
*/
SET @i_sql = (select CONCAT(' INSERT INTO ', t_table, ' SELECT * FROM ', f_table, ' WHERE `event_date` <= ',char(39), t_ts,char(39)));
select @i_sql;
/*
PREPARE stmt FROM @i_sql;
EXECUTE stmt ;
deallocate prepare stmt;
COMMIT;
*/
SET @d_sql = (select CONCAT(' DELETE FROM ', f_table, ' WHERE `event_date` <= ', char(39),t_ts, char(39)));
select @d_sql;
/*
PREPARE stmt FROM @d_sql;
EXECUTE stmt ;
deallocate prepare stmt;
COMMIT;
*/
END $$
delimiter ;
drop table users_copy;
CALL p('users', 'users_copy', now());
Yield these statements
+---------------------------------------------------+
| @c_sql |
+---------------------------------------------------+
| CREATE TABLE IF NOT EXISTS users_copy LIKE users |
+---------------------------------------------------+
1 row in set (0.00 sec)
+-----------------------------------------------------------------------------------------+
| @i_sql |
+-----------------------------------------------------------------------------------------+
| INSERT INTO users_copy SELECT * FROM users WHERE `event_date` <= '2018-05-09 19:36:54' |
+-----------------------------------------------------------------------------------------+
1 row in set (0.02 sec)
+----------------------------------------------------------------+
| @d_sql |
+----------------------------------------------------------------+
| DELETE FROM users WHERE `event_date` <= '2018-05-09 19:36:54' |
+----------------------------------------------------------------+
1 row in set (0.04 sec)
如果你希望或取消注释准备好的陈述,你可以测试每一个,然后撕掉。
答案 1 :(得分:1)
DROP PROCEDURE IF EXISTS ARCHIVE_EVENTS;
CREATE PROCEDURE ARCHIVE_EVENTS (IN f_table CHAR(100),IN t_table
CHAR(100),IN t_ts TIMESTAMP)
READS SQL DATA
COMMENT 'Test'
BEGIN
SET @c_sql = CONCAT(' CREATE TABLE IF NOT EXISTS ', t_table , ' LIKE ', f_table);
PREPARE stmt FROM @c_sql;
EXECUTE stmt ;
SET @i_sql = CONCAT(' INSERT INTO ', t_table, ' SELECT * FROM ', f_table, ' WHERE `dateTime` <= ', DATE(t_ts));
PREPARE stmt1 FROM @i_sql;
EXECUTE stmt1 ;
COMMIT;
SET @d_sql = CONCAT(' DELETE FROM ', f_table, ' WHERE `dateTime` <= ', DATE(t_ts));
PREPARE stmt2 FROM @d_sql;
EXECUTE stmt2 ;
COMMIT;
END;
CALL ARCHIVE_EVENTS ('TEST', 'WS_REL_TEST', now());
答案 2 :(得分:0)
CREATE PROCEDURE ARCHIVE_EVENTS (IN f_table CHAR(100),IN t_table
CHAR(100),IN t_ts TIMESTAMP)
BEGIN
SET @c_sql = CONCAT(' CREATE TABLE IF NOT EXISTS ', t_table , ' LIKE ', f_table);
SET @i_sql = CONCAT(' INSERT INTO ', t_table, ' SELECT * FROM ', f_table, ' WHERE `event_date` <= ',char(39), t_ts,char(39));
SET @d_sql = CONCAT(' DELETE FROM ', f_table, ' WHERE `event_date` <= ',char(39), t_ts,char(39));
PREPARE stmt FROM @c_sql;
PREPARE stmt1 FROM @i_sql;
PREPARE stmt2 FROM @d_sql;
EXECUTE stmt ;
EXECUTE stmt1 ;
EXECUTE stmt2 ;
COMMIT;
END;
由于上述答案,这是工作代码。这是适用于我的查询的最终解决方案。