0

我想创建一个每 15 天执行一次程序的事件。这个程序必须创建一个新的分区。我正在执行以下操作:

/*Vars
v_tab  --> logic tables's name
v_year --> year... to use it as part of name
v_fech --> this is used to get the current date  plus 15 days
v_day  --> this is the numbers of days to add to the current date
*/

DROP PROCEDURE IF EXISTS CreatePartition;
delimiter //
CREATE PROCEDURE CreatePartition (IN v_day INT)
BEGIN
DECLARE v_year INT;
DECLARE v_fech DATE;
DECLARE v_tab VARCHAR(20);

SET v_year = (select curdate()+0);
SET v_fech = (DATE_ADD(CURDATE(), INTERVAL v_day DAY));
SET v_tab = (select concat('p',v_year));  <--- the char p is because it doesn't accept name with only numbers

ALTER TABLE SystemEvents PARTITION BY RANGE(TO_DAYS(DeviceReportedTime))(
                PARTITION v_tab VALUES LESS THAN (TO_DAYS("v_fech")),                               
                PARTITION pDefault VALUES LESS THAN MAXVALUE  
                );
END
//
delimiter ;

如果我执行这个过程它可以工作,但如果我在一个事件中执行它,它就不起作用

call CreatePartition(15);

以下不起作用,我不知道为什么

CREATE EVENT EventPruebas
ON SCHEDULE
EVERY 15 DAY
DO
call CreatePartition(15);

我得到这个错误......

ERROR 1064 (42000): Not allowed to use NULL value in VALUES LESS THAN near '),
PARTITION p230101 VALUES LESS THAN MAXVALUE
4

1 回答 1

1

TO_DAYS("v_fech")根本没有引用命名的变量v_fech。它试图将文字字符串“v_fech”转换为天数。当然,该字符串不是有效的日期表达式,因此 TO_DAYS() 只能返回 NULL。

同样,您对 v_tab 的引用可能不是使用变量 v_tab 的值,而是使用实际的 identifier v_tab

要执行您想做的事情,您必须使用带有PREPARE 和 EXECUTE的动态 SQL 。

像下面这样的东西应该可以工作(虽然我没有测试过)。

PREPARE stmt FROM CONCAT('ALTER TABLE SystemEvents 
    PARTITION BY RANGE(TO_DAYS(DeviceReportedTime))(
        PARTITION ', v_tab, ' VALUES LESS THAN (TO_DAYS(''', v_fech, ''')),
        PARTITION pDefault VALUES LESS THAN MAXVALUE  
    )');
EXECUTE stmt;
于 2013-06-06T18:36:18.883 回答