2013-06-16 3 views
0
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 ; 

ERROR 1064 (42000) в строке 2: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'SET autocommit = 0; ПЕРЕДАЧА НАЧНЕНИЯ; ВЫБРАТЬ customer_user_id INTO 'в строке 3ошибка синтаксиса в хранимых процедурах

привет FRDS, как исправить это

ответ

2

"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 выберет третий запрос с использованием все еще активного разделителя $ разделителя и станет; Это означает, что для завершения последней команды должен быть один ;

Другие вещи:

  • START TRANSACTION; изменения автоматически autocommit

  • @userid является не определен

  • canceled_at = UNIX_TIMESTAMP (CURRENT_TIMESTAMP()): Полностью бесполезно если поле является TIMESTAMP. Поля TIMESTAMP автоматически обновляются.

+0

привет сэр спасибо за помощь он wrked но я имею такую ​​же проблему с другой процедурой http://pastebin.com/Na4PfMgh pleaseee помочь мне с этим –

1

Вы можете сделать, используя следующий метод:

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 ;