Tạo stored procedure sp_TransferMoney với 3 tham số INPUT: from_acc (INT), to_acc (INT), amount (DECIMAL(18,2)).
Procedure chuyển amount từ tài khoản from_acc sang to_acc trong một transaction (mọi thay đổi hoặc cùng thành công, hoặc không thay đổi gì). Không làm gì cả (không đổi số dư nào, không báo lỗi/không RAISERROR/THROW/SIGNAL) nếu:
amount <= 0, hoặc from_acc = to_acc;ACTIVE, hoặc số dư < amount (chuyển đúng bằng số dư thì được, số dư về 0);ACTIVE.Gợi ý cách "trừ trước, kiểm tra sau": UPDATE trừ nguồn với điều kiện đủ tiền; nếu 0 dòng bị ảnh hưởng thì ROLLBACK; tiếp theo UPDATE cộng đích; nếu 0 dòng bị ảnh hưởng thì ROLLBACK (hoàn lại khoản đã trừ!). Cuối cùng COMMIT. (SQL Server: @@ROWCOUNT; MySQL: ROW_COUNT(), LEAVE nhãn để thoát procedure.)
Hệ thống chấm gọi procedure 8 lần với các tình huống (thành công, không đủ tiền, đích đã đóng, đích không tồn tại, cùng tài khoản, số tiền âm, nguồn đã đóng...) rồi in account_id, balance của mọi tài khoản.
Bảng Accounts(account_id, balance, status).
account_id, balance (TAB), sắp theo account_id.
Ví dụ:
Đầu vào:
Đầu ra:
1 157000000.00
2 18000000.00
3 32000000.00
4 8500000000.00
5 3000000.00
6 67000000.00
7 98000000.00
8 230000000.00
9 1250000000.00
10 32000000.00
11 3400000000.00
12 780000000.00
13 410000000.00
14 410000000.00
15 32000000.00
16 8000000.00
17 1250000000.00
18 410000000.00
19 230000000.00
20 120000000.00
21 15000000.00
22 780000000.00
23 780000000.00
24 120000000.00
25 67000000.00
26 67000000.00
27 230000000.00
28 120000000.00
29 230000000.00
30 98000000.00
31 230000000.00
32 98000000.00
33 3400000000.00
34 67000000.00
35 8600000000.00
36 15000000.00
37 410000000.00
38 3000000.00
39 410000000.00
40 410000000.00
41 15000000.00
42 1250000000.00
43 15000000.00
44 15000000.00
45 230000000.00
46 780000000.00
47 1250000000.00
48 45000000.00
49 32000000.00
50 32000000.00
51 98000000.00
52 32000000.00
53 98000000.00
54 8000000.00
55 15000000.00
56 32000000.00
57 15000000.00
58 120000000.00
59 1250000000.00
60 32000000.00
61 1250000000.00
62 67000000.00
63 8000000.00
64 410000000.00
65 98000000.00
66 3400000000.00
67 67000000.00
68 780000000.00
69 410000000.00
70 120000000.00
71 230000000.00
72 67000000.00
73 8000000.00
74 1250000000.00
75 3400000000.00
76 32000000.00
77 780000000.00
78 32000000.00
79 8000000.00
80 8000000.00
81 98000000.00
82 32000000.00
83 3000000.00
84 1250000000.00
85 8000000.00
86 3400000000.00
87 780000000.00
88 98000000.00
89 410000000.00
90 32000000.00
91 780000000.00
92 120000000.00
93 8600000000.00
Giải thích:
Đang tải editor...