บล็อก DO และโค้ดนิรนาม
เรียกใช้ PL/pgSQL แบบเฉพาะกิจด้วยบล็อก DO จัดการการใส่เครื่องหมายดอลลาร์ และใช้บล็อก DO สำหรับการย้ายข้อมูลแบบครั้งเดียว
บล็อก DO และโค้ดนิรนาม เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
บล็อก DO คืออะไร
บล็อก DO ช่วยให้คุณเรียกใช้ PL/pgSQL ได้โดยไม่ต้องกำหนดฟังก์ชันที่มีชื่อ เหมาะอย่างยิ่งสำหรับการย้ายข้อมูลเฉพาะครั้งและสคริปต์เฉพาะกิจ
บล็อก DO พื้นฐาน
ไวยากรณ์ขั้นต่ำ:
DO $$
BEGIN
RAISE NOTICE 'Hello from PL/pgSQL';
END;
$$ LANGUAGE plpgsql;
-- The language defaults to plpgsql, so you can omit it:
DO $$ BEGIN RAISE NOTICE 'Hi'; END $$;การใช้เครื่องหมายดอลลาร์ครอบข้อความ
ตัวคั่น $$ ช่วยหลีกเลี่ยงการทำเครื่องหมายอัญประกาศเดี่ยวให้เป็นอักขระหลีก คุณสามารถใช้แท็กสำหรับโค้ดที่ซ้อนกันได้:
DO $outer$
BEGIN
EXECUTE $inner$ SELECT 'embedded \'quotes\'' $inner$;
END;
$outer$;DDL แบบมีเงื่อนไข
เพิ่มคอลัมน์เมื่อคอลัมน์นั้นยังไม่มีอยู่เท่านั้น:
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='users' AND column_name='last_login'
) THEN
ALTER TABLE users ADD COLUMN last_login TIMESTAMPTZ;
END IF;
END $$;ลูปสำหรับการย้ายข้อมูลจำนวนมาก
อัปเดตตารางขนาดใหญ่เป็นชุด:
DO $$
DECLARE
rows_updated INT;
BEGIN
LOOP
UPDATE users SET tier = compute_tier(...)
WHERE id IN (
SELECT id FROM users WHERE tier IS NULL LIMIT 10000
);
GET DIAGNOSTICS rows_updated = ROW_COUNT;
EXIT WHEN rows_updated = 0;
COMMIT;
END LOOP;
END $$;คำสั่งฐานข้อมูลแบบไดนามิกด้วย EXECUTE
สร้างสตริงคำสั่งฐานข้อมูลอย่างปลอดภัยด้วย format() และ EXECUTE:
DO $$
DECLARE
tbl TEXT;
BEGIN
FOR tbl IN SELECT tablename FROM pg_tables WHERE schemaname='public' LOOP
EXECUTE format('ANALYZE %I;', tbl);
END LOOP;
END $$;การควบคุมธุรกรรมภายใน DO
PG รุ่นเก่า: บล็อก DO ทำงานภายในธุรกรรมโดยนัยรายการเดียว PG 11 ขึ้นไปอนุญาตให้ใช้ COMMIT/ROLLBACK ภายใน โพรซีเยอร์ (CALL) แต่ไม่อนุญาตภายใน DO สำหรับการย้ายข้อมูลเป็นชุดที่ต้องมีการ COMMIT ให้ใช้ PROCEDURE
PROCEDURE เทียบกับ DO
- DO — ไม่ระบุชื่อ เรียกใช้ครั้งเดียว ในธุรกรรมปัจจุบัน
- PROCEDURE — มีชื่อ รองรับ COMMIT/ROLLBACK และเรียกใช้ผ่าน CALL
CREATE PROCEDURE migrate_users() LANGUAGE plpgsql AS $$
BEGIN
-- can COMMIT here
END $$;
CALL migrate_users();การจัดการข้อผิดพลาด
บล็อก EXCEPTION ทำงานเช่นเดียวกับในฟังก์ชันที่มีชื่อ:
DO $$
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'failed: %', SQLERRM;
END $$;อย่าใช้ DO กับงานที่ทำซ้ำ
หากคุณจะเรียกใช้ตรรกะเดิมมากกว่าหนึ่งครั้ง ให้กำหนดฟังก์ชันหรือโพรซีเยอร์ DO เหมาะสำหรับงานที่ทำครั้งเดียว
ใช้ DO ในการย้ายข้อมูล
เครื่องมือย้ายข้อมูลส่วนใหญ่ เช่น Flyway และ Sqitch เรียกใช้คำสั่งฐานข้อมูลทั่วไป บล็อก DO ช่วยให้คุณฝังลำดับการทำงานแบบควบคุมได้โดยไม่ต้องสร้างฟังก์ชันแยกต่างหาก
สรุป
บล็อก DO คือ PL/pgSQL สำหรับงานเฉพาะกิจ
- เรียกใช้แบบไม่ระบุชื่อเพียงครั้งเดียว
- เหมาะสำหรับ DDL แบบมีเงื่อนไขและการย้ายข้อมูล
- ระวังการใช้เครื่องหมายดอลลาร์ครอบข้อความ
- สำหรับการควบคุมธุรกรรม ให้ใช้ PROCEDURE
ตรวจสอบอย่างรวดเร็ว
คุณต้องการเรียกใช้ PL/pgSQL ครั้งเดียวระหว่างการย้ายข้อมูลโดยไม่สร้างฟังก์ชันที่มีชื่อ ควรใช้โครงสร้างใด?
คำถามที่พบบ่อย
บทเรียน “บล็อก DO และโค้ดนิรนาม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “บล็อก DO และโค้ดนิรนาม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “บล็อก DO และโค้ดนิรนาม”
เรียกใช้ PL/pgSQL แบบเฉพาะกิจด้วยบล็อก DO จัดการการใส่เครื่องหมายดอลลาร์ และใช้บล็อก DO สำหรับการย้ายข้อมูลแบบครั้งเดียว คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “บล็อก DO และโค้ดนิรนาม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW
- พื้นฐานฟังก์ชัน PL/pgSQL
- บล็อก DO และโค้ดนิรนาม
- การตรวจสอบตารางด้วยทริกเกอร์