0Pricing
SQL Academy · บทเรียน

บล็อก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างทริกเกอร์: BEFORE/AFTER, FOR EACH ROW
  2. พื้นฐานฟังก์ชัน PL/pgSQL
  3. บล็อก DO และโค้ดนิรนาม
  4. การตรวจสอบตารางด้วยทริกเกอร์
← กลับไปที่ SQL Academy