我试图在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
答案 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等替换相应的列名。希望这会有所帮助。感谢