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 ;

2 行目の ERROR 1064 (42000): SQL 構文にエラーがあります。' SET autocommit=0; の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。取引を開始します。行 3 で SELECT customer_user_id INTO '

こんにちはfrds、それを修正する方法

4

2 に答える 2

2

「デリミタ;;」有効じゃない

使用する: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 は、現在の区切り記号を使用して 2 番目のクエリを抽出し$、古い区切り記号を無視し;ます。したがって、ストアド プロシージャの異なる行は分離されません。

次に、tokenisateur は Still active delimiter $delimiter を使用して 3 番目のリクエストを抽出し、次のようになります。これは、最後のコマンドを完了するには 1 つでなければならないことを意味します;

他のもの:

  • START TRANSACTION;自動的に変更autocommit

  • @userid定義されていません

  • canceled_at = UNIX_TIMESTAMP (CURRENT_TIMESTAMP ()): フィールドが TIMESTAMP の場合はまったく役に立ちません。TIMESTAMP フィールドは自動的に更新されます。

于 2013-06-16T13:51:03.300 に答える