MySQL语法错误

MySQL语法错误,sql,mysql,stored-procedures,Sql,Mysql,Stored Procedures,执行时: BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 1; END; DECLARE EXIT HANDLER FOR SQLWARNING BEGIN ROLLBACK; SELECT 1; END; -- delete all users in the main profile t

执行时:

BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SELECT 1;
    END;

    DECLARE EXIT HANDLER FOR SQLWARNING
    BEGIN
        ROLLBACK;
        SELECT 1;
    END;

    -- delete all users in the main profile table that are in the MaineU18 by email address
    DELETE FROM ap_form_1 WHERE element_5 IN (SELECT email FROM MaineU18);

    -- delete all users from the MaineU18 table
    DELETE from MaineU18;

    COMMIT;
END;
我得到:

ERROR 1064 (42000): 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 'e1:
                DECLARE EXIT HANDLER FOR SQLEXCEPTION
                BEGIN
                        ROLLBACK' at line 2
有什么想法吗?谢谢

更新2:

I have tried putting the script into a PROCEDURE:

DELIMITER |DROP PROCEDURE IF EXISTS temp_clapro|
CREATE PROCEDURE temp_clapro()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING ROLLBACK;

    SET AUTOCOMMIT=0;

    -- delete all users in the main profile table that are in the MaineU18 by email address
    DELETE FROM ap_form_1 WHERE element_5 IN (SELECT email FROM MaineU18);

    -- delete all users from the MaineU18 table
    DELETE from MaineU18;

    COMMIT;
    SET AUTOCOMMIT=1;
END
|
DELIMITER ;CALL temp_clapro();
我仍然有问题:

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (2.40 sec)

Query OK, 0 rows affected (2.40 sec)

Query OK, 0 rows affected (2.40 sec)

Query OK, 0 rows affected (2.40 sec)

ERROR 1064 (42000): 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 'END;
|
DELIMITER ;CALL temp_clapro()' at line 1
更新3:

I have tried putting the script into a PROCEDURE:

DELIMITER |DROP PROCEDURE IF EXISTS temp_clapro|
CREATE PROCEDURE temp_clapro()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING ROLLBACK;

    SET AUTOCOMMIT=0;

    -- delete all users in the main profile table that are in the MaineU18 by email address
    DELETE FROM ap_form_1 WHERE element_5 IN (SELECT email FROM MaineU18);

    -- delete all users from the MaineU18 table
    DELETE from MaineU18;

    COMMIT;
    SET AUTOCOMMIT=1;
END
|
DELIMITER ;CALL temp_clapro();
我的许多问题似乎都是因为我使用“SOURCE”命令从文件运行脚本。如果我在文件中只有DROP和CREATE命令,并在文件外运行DELIMITER和CALL命令,那么一切都不会出错


是否可以从单个脚本文件运行此脚本?

您似乎正在使用
BEGIN
作为临时语句块的开头,就像在Oracle中一样

MySQL不支持这个。只能在存储过程、存储函数或触发器的主体中声明

:

DECLARE
仅允许在
BEGIN中使用
... 结束
复合语句,并且必须是 开始时,在任何其他 声明

:

开始。。。结束语法用于 编写复合语句,可以 显示在存储程序中



这是你的评论和更新的问题:我不知道为什么它失败了。我自己就试过了,效果很好。我在Macbook上使用MySQL 5.0.75。您正在使用哪个版本的MySQL?

您似乎正在使用
BEGIN
作为一组特殊语句的开头,就像在Oracle中一样

MySQL不支持这个。只能在存储过程、存储函数或触发器的主体中声明

:

DECLARE
仅允许在
BEGIN中使用
... 结束
复合语句,并且必须是 开始时,在任何其他 声明

:

开始。。。结束语法用于 编写复合语句,可以 显示在存储程序中



这是你的评论和更新的问题:我不知道为什么它失败了。我自己就试过了,效果很好。我在Macbook上使用MySQL 5.0.75。您正在使用哪个版本的MySQL?

您在语句分隔符的过程中使用分号,因此您必须更改客户端中的分隔符。请参见

在语句分隔符的过程中使用分号,因此必须更改客户端中的分隔符。参见

比尔:你指的是SQL Server,不是Oracle。Oracle仅在程序和函数体中使用BEGIN/END;SQL Server喜欢它的BEGIN/END语句……感谢你们的帮助,但即使在将脚本放入过程块之后,我仍然有问题。谢谢你迄今为止的帮助。“更新1”在上面。@rexem,谢谢提醒。我以为我见过Oracle脚本使用裸开始/结束块,但也许我只是把它与Microsoft混淆了。比尔:你是说SQL Server,不是Oracle。Oracle仅在程序和函数体中使用BEGIN/END;SQL Server喜欢它的BEGIN/END语句……感谢你们的帮助,但即使在将脚本放入过程块之后,我仍然有问题。谢谢你迄今为止的帮助。“更新1”在上面。@rexem,谢谢提醒。我以为我见过Oracle脚本使用裸开始/结束块,但也许我只是把它与Microsoft混淆了。谢谢你的建议。我有点接近,但仍然看到错误。谢谢你的建议。我有点接近了,但仍然看到了错误。