나는 데이터베이스 과정에 대한 과제로 "뱅크"를 구축하고 있습니다. 몇 가지 IN
변수 (예 : 계정 ID, 고객 ID 및 PIN 번호)를 사용하는 저장 함수를 만들었으며 제출 된 데이터가 유효한지 확인하기 위해이 함수를 검사합니다. 데이터가 유효하면 절차는 계좌 잔액을 업데이트하여 화폐 거래를 나타냅니다. 그런 다음 제출 된 데이터가 유효한지 여부를 "반환"합니다. 다음 절차에 대한 코드입니다 :함수 내부에서 프로 시저를 호출하면 MySQL ERROR가 발생합니다. 1422
DELIMITER //
CREATE PROCEDURE retrieveMoney (
IN holder INT,
IN pin VARCHAR(4),
IN account INT,
IN amount FLOAT,
OUT success INT
)
BEGIN
START TRANSACTION;
SELECT COUNT(id) INTO success FROM account_holder WHERE id=holder AND pin=pin;
IF success IS NOT NULL THEN
IF (SELECT balance-amount FROM account WHERE id=account) >= 0 THEN
UPDATE account SET balance = balance-amount WHERE id=account;
CALL logTransaction(account,NULL,amount);
COMMIT;
ELSE ROLLBACK;
END IF;
ELSE ROLLBACK;
END IF;
END//
DELIMITER ;
내가 쉽게 프로 시저의 출력을 볼 수 있도록 원했고, 나는 내가 래퍼 함수를 작성하기로 결정했습니다 함수 내에서 트랜잭션을 사용하는 것이 허용되지 않아으로는, 다음과 같이
DELIMITER //
CREATE FUNCTION retrieveMoney (
holder INT,
pin VARCHAR(4),
account INT,
amount FLOAT
)
RETURNS INT
BEGIN
CALL retrieveMoney(holder,pin,account,amount,@success);
RETURN @success;
END//
DELIMITER ;
을 불행하게도이 작동하지 않습니다, 나는 여전히 다음과 같은 오류 얻을 :
ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger.
이 내가 때문입니다 함수 안에 트랜잭션이 포함 된 프로 시저를 호출 하시겠습니까?
예. 예. 오류 메시지가 큰 소리로 알려줍니다. –