CREATE TABLE accounts (
id INT PRIMARY KEY,
balance NUMERIC
);
CREATE OR REPLACE PROCEDURE transfer_funds(
from_account INT,
to_account INT,
amount NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
-- Начинаем внутреннюю транзакцию
BEGIN
-- Снимаем средства
UPDATE accounts
SET balance = balance - amount
WHERE id = from_account;
-- Проверим, достаточно ли средств
IF NOT FOUND THEN
RAISE EXCEPTION 'Source account not found';
END IF;
-- Переводим средства
UPDATE accounts
SET balance = balance + amount
WHERE id = to_account;
IF NOT FOUND THEN
RAISE EXCEPTION 'Destination account not found';
END IF;
-- Завершаем внутреннюю транзакцию
COMMIT;
EXCEPTION WHEN OTHERS THEN
-- Откат в случае любой ошибки
ROLLBACK;
RAISE;
END;
END;
$$;
CALL transfer_funds(1, 2, 100.00);