Skip to main content

Stored Procedures ใน PostgreSQL

บทนำ

Stored Procedure (หรือที่เรียกว่า Procedure) คือชุดคำสั่ง SQL ที่ถูกเก็บไว้ในฐานข้อมูลและสามารถเรียกใช้ซ้ำได้เมื่อจำเป็น โดยที่ไม่ต้องเขียนคำสั่ง SQL ใหม่ทุกครั้งที่ต้องการดำเนินการบางอย่าง โดยการใช้ Stored Procedure ช่วยให้สามารถดำเนินการที่ซับซ้อนได้อย่างมีประสิทธิภาพและสามารถจัดการการทำงานในฐานข้อมูลได้ดีขึ้น

ใน PostgreSQL, Stored Procedures สามารถใช้ภาษา PL/pgSQL หรือภาษาที่รองรับอื่น ๆ เช่น PL/Python, PL/Perl สำหรับการเขียนคำสั่ง

1. การสร้าง Stored Procedure

ในการสร้าง Stored Procedure เราจะใช้คำสั่ง CREATE PROCEDURE ตามด้วยชื่อของโปรซีเจอร์และรายการของพารามิเตอร์ที่ใช้ในโปรซีเจอร์นั้น

ตัวอย่าง:

CREATE PROCEDURE update_employee_salary(employee_id INT, new_salary NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE employees
SET salary = new_salary
WHERE id = employee_id;
END;
$$;

ในตัวอย่างนี้ เรากำลังสร้าง Stored Procedure ชื่อ update_employee_salary ที่จะอัปเดต salary ของพนักงานในตาราง employees โดยการรับค่า employee_id และ new_salary เป็นพารามิเตอร์

2. การเรียกใช้ Stored Procedure

เมื่อสร้าง Stored Procedure เสร็จแล้ว เราสามารถเรียกใช้มันได้โดยใช้คำสั่ง CALL ตามด้วยชื่อโปรซีเจอร์และพารามิเตอร์ที่ต้องการ

ตัวอย่าง:

CALL update_employee_salary(101, 60000);

ในตัวอย่างนี้ เรากำลังเรียกใช้ Stored Procedure ชื่อ update_employee_salary เพื่ออัปเดต salary ของพนักงานที่มี employee_id เท่ากับ 101 เป็น 60000

3. การใช้ Output Parameters

Stored Procedure สามารถรับและส่งค่าผลลัพธ์ (output) ผ่านพารามิเตอร์ได้ โดยสามารถกำหนดให้พารามิเตอร์เป็น IN, OUT, หรือ INOUT เพื่อบอกทิศทางของข้อมูล

  • IN ใช้สำหรับพารามิเตอร์ที่รับค่าเข้า
  • OUT ใช้สำหรับพารามิเตอร์ที่ส่งค่าออก
  • INOUT ใช้สำหรับพารามิเตอร์ที่รับค่าเข้าและส่งค่าผลลัพธ์ออก

ตัวอย่าง:

CREATE PROCEDURE get_employee_salary(employee_id INT, OUT salary NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
SELECT employee_salary INTO salary
FROM employees
WHERE id = employee_id;
END;
$$;

ในตัวอย่างนี้, salary จะเป็นพารามิเตอร์แบบ OUT ที่จะส่งค่าผลลัพธ์กลับจาก Stored Procedure

การเรียกใช้:

CALL get_employee_salary(101, salary);

ในตัวอย่างนี้, ผลลัพธ์ของเงินเดือนพนักงานที่มี employee_id เท่ากับ 101 จะถูกเก็บในตัวแปร salary

4. การใช้ EXCEPTION Handling

Stored Procedure ใน PostgreSQL สามารถใช้ exception handling เพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการประมวลผล โดยใช้คำสั่ง BEGIN ... EXCEPTION ... END

ตัวอย่าง:

CREATE PROCEDURE safe_update_employee_salary(employee_id INT, new_salary NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE employees
SET salary = new_salary
WHERE id = employee_id;

IF NOT FOUND THEN
RAISE EXCEPTION 'Employee not found with id %', employee_id;
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'An error occurred while updating salary: %', SQLERRM;
END;
$$;

ในตัวอย่างนี้, หากไม่พบพนักงานที่มี employee_id ที่ระบุ, จะมีการยกข้อผิดพลาดโดยใช้คำสั่ง RAISE EXCEPTION

5. การแก้ไขและลบ Stored Procedure

  • การแก้ไข Stored Procedure ใน PostgreSQL สามารถทำได้โดยการลบ Stored Procedure เดิมแล้วสร้างใหม่
  • การลบ Stored Procedure ใช้คำสั่ง DROP PROCEDURE

ตัวอย่างการลบ:

DROP PROCEDURE update_employee_salary;

6. การใช้ Stored Procedure ในการทำงานแบบ Batch

การใช้ Stored Procedure ช่วยให้สามารถทำงานที่ซับซ้อนได้ง่ายขึ้น เช่น การอัปเดตข้อมูลหลาย ๆ รายการในคราวเดียว โดยการใช้ Stored Procedure เพื่อดำเนินการแบบ batch

ตัวอย่าง:

CREATE PROCEDURE update_multiple_salaries()
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 101;
UPDATE employees SET salary = salary * 1.05 WHERE department_id = 102;
-- เพิ่มคำสั่งอื่น ๆ ได้
END;
$$;

ในตัวอย่างนี้, Stored Procedure จะทำการอัปเดตเงินเดือนของพนักงานในแผนก 101 และ 102 ในคราวเดียว

7. ข้อดีและข้อเสียของการใช้ Stored Procedure

ข้อดี:

  • ลดการเขียน SQL ซ้ำ ๆ: ช่วยให้สามารถใช้คำสั่ง SQL ที่ซับซ้อนซ้ำ ๆ ได้โดยไม่ต้องเขียนใหม่ทุกครั้ง
  • ประสิทธิภาพดีขึ้น: ลดจำนวนการส่งคำสั่ง SQL ไปยังฐานข้อมูลโดยตรง
  • การจัดการที่ดีขึ้น: การแยก logic การทำงานออกจากแอปพลิเคชันทำให้การบำรุงรักษาระบบทำได้ง่ายขึ้น

ข้อเสีย:

  • ความซับซ้อน: การสร้างและบำรุงรักษา Stored Procedure อาจทำให้ระบบมีความซับซ้อนมากขึ้น
  • ข้อจำกัดในบางกรณี: การใช้ Stored Procedure อาจไม่เหมาะสมสำหรับกรณีที่ต้องการความยืดหยุ่นสูง หรือการเปลี่ยนแปลงที่บ่อย

สรุป

Stored Procedure เป็นเครื่องมือที่มีประโยชน์ใน PostgreSQL ที่ช่วยให้การดำเนินการที่ซับซ้อนและการจัดการฐานข้อมูลเป็นไปได้อย่างมีประสิทธิภาพ โดยสามารถเก็บคำสั่ง SQL ที่ใช้งานบ่อย ๆ ไว้ในฐานข้อมูลและเรียกใช้ได้หลายครั้ง การใช้ Stored Procedure ช่วยลดความซ้ำซ้อนในการเขียน SQL และสามารถจัดการกับข้อผิดพลาดและการทำงานที่ซับซ้อนได้อย่างมีระเบียบ