$$ DELIMITER

时间:2016-03-07 09:46:23

标签: mysql

我在创建存储过程时遇到错误,它说我有语法错误,但我找不到它的位置......

MySql错误:

  

“您的SQL语法有错误;请查看手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'$$ DELIMITER

     

CREATE PROCEDURE'entradas_sai'(IN ID_VEICULO VARCHAR(45),OUT'at at   第1行

以下是与主题相关的代码:

$$DELIMITER

CREATE PROCEDURE 'entradas_sai'(
IN ID_VEICULO VARCHAR(45), OUT retcode INT)
BEGIN
    DECLARE '_rollback' BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET '_rollback' = 1;
    START TRANSACTION;
    INSERT INTO SAIDAS(data, hora) VALUES(CURDATE("yyyy-MM-dd"),CURTIME("hh:mm:ss))
    UPDATE ENTRADAS(SAI) WITH VALUES(@SAI)
    IF '_rollback' THEN
        SET retcode = 0;
        ROLLBACK;
    ELSE
        SET retcode = 1;
        COMMIT;
    END IF;
END$$

DELIMITER ;

以下是MySqlWB的截图:

MySql WorkBench

编辑: 这是日志:

>Executing:
>USE `portaria`;
>DROP unknown IF EXISTS `unknown_SYNTAX_ERROR`;
>
>DELIMITER $$
>USE `portaria`$$
>DELIMITER $$
>
>CREATE PROCEDURE 'entradas_sai'(
>IN ID_VEICULO VARCHAR(45), OUT retcode INT)
>BEGIN
>    DECLARE '_rollback' BOOL DEFAULT 0;
>    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET '_rollback' = 1;
>    START TRANSACTION;
>    INSERT INTO SAIDAS(data, hora) VALUES(date(now()) ,time(now()))
>    UPDATE ENTRADAS(SAI) WITH VALUES(@SAI)
>    IF '_rollback' THEN
>        SET retcode = 0;
>        ROLLBACK;
>    ELSE
>        SET retcode = 1;
>        COMMIT;
>    END IF;
>END$$
>
>DELIMITER ;$$
>
>DELIMITER ;
>
>ERROR 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 >'unknown IF EXISTS `unknown_SYNTAX_ERROR`' at line 1
>SQL Statement:
>DROP unknown IF EXISTS `unknown_SYNTAX_ERROR`

在这里,我得到了一个我希望我的程序要做的事情......

  

我有一张叫做“Entradas”的桌子,还有一张叫做“Saidas”的桌子。都有   列“数据”和“hora”。考虑到这一点,自“数据”和   “entradas”的hora列意味着那辆车在那个时候加入了   时间,以及“sayas”列“data”和“hora”中的值   意思是插入,因为我点击一个按钮,插入当前   日期和时间。我正在请求一个可以插入的SQL语法   值“data”和“hora”进入表“saidas”并更新值   “entradas”称为“sai”,等于0,我希望它改为   按下按钮1 ...任何消化?

3 个答案:

答案 0 :(得分:2)

分隔符符号($$)来自DELIMITER关键字。也可以使用date(now())代替CURDATE("yyyy-MM-dd")time(now())代替CURTIME("hh:mm:ss")) 试试这个

DELIMITER $$
CREATE PROCEDURE `entradas_sai`(IN ID_VEICULO VARCHAR(45), OUT retcode INT)
BEGIN
        DECLARE _rollback boolean DEFAULT 0;
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _rollback = 1;
        START TRANSACTION;
        INSERT INTO SAIDAS(data, hora) VALUES(date(now()) ,time(now()));
        UPDATE ENTRADAS SET SAI = @SAI;
        IF _rollback = 1 THEN
            SET retcode = 0;
            ROLLBACK;
        ELSE
            SET retcode = 1;
            COMMIT;
        END IF;
    END$$

DELIMITER ;

答案 1 :(得分:1)

如果我是对的,您错误输入了$$DELIMITER,那应该是DELIMITER $$

编辑:在为问题添加屏幕截图后,我相信你不应该引用程序名称。我已经更新了代码块,请再试一次。

DELIMITER $$
CREATE PROCEDURE entradas_sai(
IN ID_VEICULO VARCHAR(45), OUT retcode INT)
BEGIN
    DECLARE '_rollback' BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET '_rollback' = 1;
    START TRANSACTION;
    INSERT INTO SAIDAS(data, hora) VALUES(CURDATE("yyyy-MM-dd"),CURTIME("hh:mm:ss"))
    UPDATE ENTRADAS(SAI) WITH VALUES(@SAI)
    IF '_rollback' THEN
        SET retcode = 0;
        ROLLBACK;
    ELSE
        SET retcode = 1;
        COMMIT;
    END IF;
END$$

DELIMITER ;

答案 2 :(得分:0)

我想到了什么是错的,并且它不仅仅是关于" DELIMITER"但有更多的事情......

这是固定代码:

    CREATE PROCEDURE entradas_sai (
IN ID_VEICULO VARCHAR(45), OUT retcode INT)
BEGIN
    DECLARE _rollback BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _rollback = 1;
    START TRANSACTION;
    INSERT INTO SAIDAS(data, hora) VALUES(date(now()) ,time(now()));
    UPDATE ENTRADAS SET SAI=1;
    IF '_rollback' THEN
        SET retcode = 0;
        ROLLBACK;
    ELSE
        SET retcode = 1;
        COMMIT;
    END IF;
END $$

步骤:删除" Delimiter $$"和"分隔符;"然后重新构建UPDATE查询。这是主要的问题,因为语法不在现场......感谢所有试图帮助的人。

在这种情况下," 1"的值不是我想要的值......所以,我将它改为@sai,这意味着该值是在按钮点击时给出的,这是参数@sai的增量,等于1,2, 3,4等等。