繁体   English   中英

存储过程中的语法错误

[英]syntax error in stored procedures

DELIMITER ;;
CREATE  PROCEDURE `CANCEL_ORDER`(IN order_id INT, IN buyer_user_id INT)
BEGIN
    SET autocommit=0;
    START TRANSACTION;
    SELECT customer_user_id INTO @userid FROM orders WHERE id=order_id;
    IF @userid=buyer_user_id THEN
        UPDATE orders SET status='failed',canceled_at=UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) WHERE id=order_id;
        COMMIT;
    ELSE
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Error: Customer ID in orders does not match with given buyer_user_id', MYSQL_ERRNO = 1003;
        ROLLBACK;
    END IF;
END;;
DELIMITER ;

第2行的错误1064(42000):您的SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册,以在'SET autocommit = 0附近使用正确的语法; 开始交易; 在第3行上选择customer_user_id INTO'

嗨FRDS,如何纠正它

“ DELIMITER ;;” 无效的

使用: DELIMITER New_delimiter Old_Delimiter_To_Finish_Line

两个定界符必须不同

在该过程的代码中,使用旧的定界符,但在新代码后完成; 恢复旧的分隔符

DELIMITER $;
CREATE  PROCEDURE `CANCEL_ORDER`(IN order_id INT, IN buyer_user_id INT)
BEGIN
    SET autocommit=0;
    START TRANSACTION;
    SELECT customer_user_id INTO @userid FROM orders WHERE id=order_id;
    IF @userid=buyer_user_id THEN
        UPDATE orders SET status='failed',canceled_at=UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) WHERE id=order_id;
        COMMIT;
    ELSE
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Error: Customer ID in orders does not match with given buyer_user_id', MYSQL_ERRNO = 1003;
        ROLLBACK;
    END IF;
END;$
DELIMITER ; $

操作如下:tokenisateur将使用当前的定界符提取第一个查询; 分隔符变为$ 。tokenisateur将使用当前分隔符$提取第二个查询,并忽略旧的分隔符; 因此,存储过程的不同行将不会分开。

然后tokenisateur将使用“仍然活动的定界符$ delimiter”提取第三个请求,并变为; 这意味着要完成最后一个命令必须是一个;

其他事情:

  • START TRANSACTION; 更改自动autocommit

  • @userid未定义

  • canceled_at = UNIX_TIMESTAMP (CURRENT_TIMESTAMP ()) :如果该字段是TIMESTAMP,则完全没有用。 TIMESTAMP字段将自动更新。

您可以使用以下方法进行操作:

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `cancel_order`$$

CREATE DEFINER=`root`@`%` PROCEDURE `cancel_order`(IN order_id INT, IN buyer_user_id INT)
BEGIN
    DECLARE v_cancel BOOLEAN DEFAULT FALSE;
    SET autocommit=0;
    START TRANSACTION;
    SELECT TRUE INTO v_cancel FROM orders WHERE id=order_id AND customer_user_id=buyer_user_id;
    IF v_cancel THEN
    UPDATE orders SET STATUS='failed',canceled_at=NOW() WHERE id=order_id;
    COMMIT;
    ELSE
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Error: Customer ID in orders does not match with given buyer_user_id', MYSQL_ERRNO = 1003;
    ROLLBACK;
    END IF;
END$$

DELIMITER ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM