0

アカウント間の支払いを行うために、MYSQL データベースでこのストアド プロシージャを使用して練習しています。2 つのアカウント (acct1、acct2)、支払われる金額 (amt) の入力を受け取り、確認メッセージ (pmessage) を出力します。

(IF (balance1 >=amt) THEN ...) の場合にのみ支払いを行うことになっていますが、どういうわけか、利用可能な残高を超える金額を入力すると、支払いが行われます。理解できない。助けてください。

コードは次のとおりです。

DELIMITER //
CREATE PROCEDURE `make_payment`(IN `acct1` int(4), IN `acct2` int(4), IN `amt` float(10,2) unsigned, OUT `pmessage` varchar(100))

BEGIN
    DECLARE balance1 FLOAT;
    DECLARE balance2 FLOAT;

    IF(acct1 !=acct2) THEN 
        SELECT balance INTO balance1 FROM mydb.accounts
            WHERE account_no =acct1
            ORDER BY balance DESC LIMIT 1;

        SELECT balance INTO balance2 FROM mydb.accounts
            WHERE account_no =acct2
            ORDER BY balance DESC LIMIT 1;

        IF (balance1 >=amt) THEN 
            begin
                SET balance1 =balance1-amt;
                SET balance2 =balance2+amt;

                INSERT INTO mydb.accounts(account_no, outflow, balance)
                    VALUES(acct1, amt, balance1);

                INSERT INTO mydb.accounts(account_no, inflow, balance)
                    VALUES(acct2, amt, balance2);

                SET pmessage ="payment was successful";
            END;

        ELSE SET pmessage ="insufficient balance";
        END IF;
    END IF;
END //
DELIMITER ;
4

1 に答える 1

1

(回答へのアップグレード)

accountsテーブルbalanceを降順で並べ替えているため、「利用可能な残高」がそのテーブル内の特定のアカウントの最大残高であると想定しています。代わりに、ORDER BY日付を記入して最新のレコードを選択します。

上記の私のコメントで行われた他の点にも注意してください。

  1. DECIMAL通貨には、浮動小数点型ではなく固定小数点データ型 ( など) を使用する必要があります。と

  2. 同時実行の問題を防ぐために、トランザクションでこれらのアクションを実行する必要があります。

于 2012-05-15T13:30:50.347 に答える