创建mysql程序

时间:2017-12-29 08:18:19

标签: mysql sql procedures

我试图在mysql数据库中创建过程,此过程会将帐户从表移动到另一个 这是我的程序,但我的语法错误

CREATE PROCEDURE radius.archive_acct()
BEGIN
 INSERT INTO radacctold
 SELECT * FROM radacct
 WHERE acctstoptime > 0
 AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
 DELETE FROM radacct
WHERE acctstoptime > 0
AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
END

这是错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6

3 个答案:

答案 0 :(得分:0)

您应该将正常分隔符更改为其他值,然后创建并结束该过程并重置分隔符。

DELIMITER //
CREATE PROCEDURE radius.archive_acct()
BEGIN
 INSERT INTO radacctold
 SELECT * FROM radacct
 WHERE acctstoptime > 0 AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
 DELETE FROM radacct
 WHERE acctstoptime > 0
 AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);
END //
DELIMITER ;

有关更多见解,请参阅:Getting Started with MySQL Stored Procedures

答案 1 :(得分:0)

存储过程结构用于支持多个可执行语句 并且每个语句都需要一个终结符,默认为分号。 ;

需要指示mysql引擎立即停止执行每个终止的语句,直到编译完正文结构。

我们需要DELIMITER语句来暂时取消默认终结符 您的代码未使用此类DELIMITER

以下示例将有助于修复您的代码。

-- define the delimiter
delimiter //


--- place here your stored procedure

-- and lastly following line
//

-- reset the delimiter
delimiter ;

在此处阅读我对类似问题的回答:https://stackoverflow.com/a/23160180/767881

答案 2 :(得分:-1)

替换

INSERT INTO radacctold
SELECT * FROM radacct
WHERE acctstoptime > 0
AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);

 INSERT INTO radacctold(field1, field1, field3...)
 SELECT * FROM radacct
 WHERE acctstoptime > 0
 AND date(acctstarttime) < (CURDATE() - INTERVAL 3 MONTH);

尝试使用select语句插入表时,需要指定列名。请用field1,field2等替换相应的列名。希望这会有所帮助。感谢