2012-05-15 5 views
0

나는 계정간에 지불을하기 위해 MYSQL 데이터베이스에서이 저장 프로 시저로 연습하고 있습니다.mysql 저장 프로 시저 : 흐름 제어

(IF (balance1> = amt) THEN) 만 지불해야하는 두 개의 계정 (acct1, acct2), 지불 할 금액 (amt)이 입력됩니다. ..),하지만 여하튼 내가 사용할 수있는 잔액보다 큰 금액을 입력 할 때, 그것은 여전히 ​​지불을하기 위해 앞서 간다. 나는 이해하지 못한다. pls 도움이됩니다. 여기

코드이다 그러므로 당신이 가정하고,

당신은 내림차순으로 balance하여 accounts 테이블을 주문하고

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 ; 
+0

당신은 우리에게 acct1, ACCT2, AMT 값의 몇 가지 예와 ACCOUNTS.BALANCE 값을 해당 계정에 대한 (즉 저울 1 및 balance2) 예상대로 위의 코드가 작동하지 않습니다 위해를 줄 수 있습니까? –

+0

이 경우에 이것이 문제가 될지는 모르겠지만 돈과 같은 이산 량에 대해 'DECIMAL'과 같은 고정 소수점 데이터 유형을 사용하는 것이 좋습니다. 그렇지 않으면 부동 소수점 데이터 유형의 근본적인 특성으로 인해 바람직하지 않은 반올림 버그가 발생할 수 있습니다 . "사용 가능한 잔고"가'accounts' 테이블에있는 주어진 계정의 * 가장 좋은 잔액입니까? 나는 당신이'ORDER BY' 날짜를 원한다고 생각합니다 ... 트랜잭션 내에서 이러한 작업을 수행하여 동시성 문제를 방지해야합니다. – eggyal

+0

감사합니다 @ BobJarvis, @eggyal : 당신이 맞아, 나는 균형이 아니라 datetime으로 주문할 것을 의미했습니다. 코드가 잘 작동합니다. D : 대단히 감사합니다. –

답변

1

(답변-업그레이드) 그 "가능한 균형 "해당 테이블에서 주어진 계정에 대해 가장 큰 균형입니다. 대신 ORDER BY 날짜를 원하고 가장 최근 레코드를 선택하십시오.

도 포함하여 위 내 댓글에서 만든 다른 점을 유의하시기 바랍니다 :

  1. 당신은 고정 소수점 데이터 유형을 사용한다고

    , 통화 (예 : DECIMAL 등) 대신 부동 소수점 형식의;

  2. 트랜잭션에서 이러한 작업을 수행하여 동시성 문제를 방지해야합니다.