Savepoints และการ Rolling Back
มาต่อกันที่เรื่องปริมาณเงินฝากประจำที่กำลังจะครบกำหนดในอนาคตอันใกล้ โดยเฉพาะรายที่มีมูลค่าเกิน 250K ซึ่งส่งผลกระทบมากที่สุดต่อสถานการณ์ที่เกิดขึ้นในช่วงวิกฤตตลาดปี 2008
RCONHK12 (>=250K) เก็บข้อมูลเงินฝากที่ครบกำหนดภายใน 3 เดือนข้างหน้า และ RCONHK13 (>=250K) เก็บข้อมูลที่ครบกำหนดระหว่าง 3 ถึง 12 เดือน หากมูลค่าเหล่านี้สูงกว่า 1 ล้านดอลลาร์ อาจทำให้ธนาคารขาดสภาพคล่อง เนื่องจากลูกค้ากลุ่มนี้มักเป็นรายใหญ่ที่อาจถอนสินทรัพย์อื่นออกไปด้วย ในทางกลับกัน หากมูลค่าต่ำกว่า 500K ถือเป็นปัจจัยบวก
โค้ดของฉันมีข้อผิดพลาดบางจุด เพราะตั้งค่าไม่ถูกต้องสำหรับรายที่มีมูลค่าเกิน 500K!
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Transactions and Error Handling in PostgreSQL
คำแนะนำการฝึกหัด
- ภายใน transaction ให้ตั้งค่า
FIELD48เป็นmature+เมื่อยอดเงินฝากที่ครบกำหนดรวมน้อยกว่า 500,000 ดอลลาร์ แล้วตั้ง savepoint ชื่อmatureplus_flag_set - ตั้งค่า
FIELD48เป็นmature-เมื่อยอดเงินฝากที่ครบกำหนดรวมอยู่ระหว่าง 500,000 ถึง 1 ล้านดอลลาร์ แล้วตั้ง savepoint ชื่อmatureminus_flag_set - ตั้งค่า
FIELD48เป็นmature--เมื่อยอดเงินฝากที่ครบกำหนดรวมมากกว่า 100,000 ดอลลาร์ (ไม่ใช่ 1 ล้านดอลลาร์) — "โดยไม่ได้ตั้งใจ" ลืมเติมเลข0ไปหนึ่งตัว - ย้อนกลับไปยังจุดหลังจากที่ตั้งค่าเร็กคอร์ด
mature-แล้วนับจำนวนธนาคารทั้งหมดที่มีกำหนดการครบกำหนดเงินฝากแบบmature--
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
BEGIN;
-- Update FIELD48 to indicate a positive maturity rathing when less than $500 thousand.
UPDATE ffiec_reci
SET ___ = '___'
WHERE RCONHK12 + RCONHK13 < 500000;
-- Set a savepoint
SAVEPOINT ___;
-- Update FIELD48 to indicate a negative maturity rathing when between $500 thousand and $1 million.
UPDATE ffiec_reci
___
WHERE RCONHK12 + RCONHK13 BETWEEN ___ AND ___;
-- Set a savepoint
SAVEPOINT ___;
-- Accidentailly update FIELD48 to indicate a double negative maturity rating when more than 100K
UPDATE ffiec_reci
SET ___ = '___'
WHERE RCONHK12 + RCONHK13 > 100000;
-- Rollback to before the last mistake
ROLLBACK TO ___;
-- Select count of records with a double negative indicator
SELECT count(FIELD48)
from ffiec_reci
WHERE FIELD48 = 'mature--';