ในการทำงานกับฐานข้อมูล Oracle คุณจะพบทั้ง SQL และ PL/SQL ซึ่งถึงแม้จะชื่อคล้ายกันและทำงานร่วมกัน แต่มีหน้าที่และโครงสร้างที่ต่างกันอย่างสิ้นเชิงครับ
สรุปสั้น ๆ คือ SQL เป็น “ภาษาที่ใช้สั่งการ” (What to do) ส่วน PL/SQL เป็น “ภาษาที่ใช้เขียนโปรแกรม” (How to do)
SQL (Structured Query Language)
SQL เป็นภาษามาตรฐานที่ใช้สื่อสารกับฐานข้อมูลแบบ Relational Database (RDBMS) โดยเน้นไปที่ผลลัพธ์
- ลักษณะเด่น: เป็น Non-procedural language คือเราบอกแค่ว่า “ต้องการข้อมูลอะไร” แต่ไม่ได้บอกว่า “ต้องทำอย่างไร (Step-by-step) “
- การทำงาน: ประมวลผลทีละคำสั่ง (Single statement) เช่น
SELECT,INSERT,UPDATE,DELETE - ข้อจำกัด: ไม่สามารถเขียน logic ที่ซับซ้อนอย่าง Loop หรือ If-Else ภายในคำสั่ง SQL ชุดเดียวได้
PL/SQL (Procedural Language / SQL)
PL/SQL เป็นส่วนขยายของ Oracle ที่นำความสามารถของภาษาโปรแกรมมิ่ง (Procedural) มาใส่ใน SQL
- ลักษณะเด่น: เป็น Procedural language ที่รวมเอา SQL เข้ามาไว้ด้วยกัน ช่วยให้เขียน Logic ซับซ้อนได้
- การทำงาน: ประมวลผลเป็น “Block” (ชุดของคำสั่ง) ซึ่งจะถูกส่งไปที่ฐานข้อมูลในครั้งเดียว ช่วยลดทอน Traffic ระหว่าง Application กับ Database
- ฟีเจอร์เด่น: มีตัวแปร (Variables) , การจัดการข้อผิดพลาด (Exception Handling) , การวนลูป (Loops) , และเงื่อนไข (Conditions)
ตารางเปรียบเทียบความแตกต่าง
| คุณสมบัติ | SQL | PL/SQL |
| ประเภทภาษา | Declarative (สั่งสิ่งที่ต้องการ) | Procedural (สั่งตามลำดับขั้นตอน) |
| หน่วยประมวลผล | ทีละหนึ่งคำสั่ง (Single query) | เป็นบล็อก (Block of code) |
| Logic Control | ไม่มี (ทำไม่ได้) | มี IF-THEN-ELSE, LOOP, FOR |
| ตัวแปร | ไม่สามารถประกาศตัวแปรใช้งานเองได้ | ประกาศตัวแปรและเก็บค่าได้ |
| การประมวลผล | ประมวลผลที่ SQL Engine | ประมวลผลที่ PL/SQL Engine |
| ความผิดพลาด | แสดง Error ทันที | มีส่วน Exception Handling เพื่อจัดการ Error |
ตัวอย่างการใช้งาน
ตัวอย่าง SQL
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;
(สั่งให้เพิ่มเงินเดือน 10% สำหรับแผนก 10 เท่านั้น
ตัวอย่าง PL/SQL
DECLARE v_bonus NUMBER;
BEGIN SELECT salary * 0.5 INTO v_bonus FROM employees WHERE employee_id = 101; IF v_bonus > 5000 THEN UPDATE employees SET salary = salary + 5000 WHERE employee_id = 101; ELSE UPDATE employees SET salary = salary + v_bonus WHERE employee_id = 101; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('ไม่พบข้อมูลพนักงาน') ;
END;
(มีการตรวจสอบเงื่อนไขก่อนอัปเดต และมีการดักจับข้อผิดพลาดหากไม่พบข้อมูล)
สรุป
ถ้าคุณต้องการแค่ดึงข้อมูลหรือแก้ไขข้อมูลทั่วไป SQL คือคำตอบ แต่ถ้าคุณต้องสร้าง Business Logic ที่ซับซ้อนภายใน Database หรือต้องการสร้าง Stored Procedures, Functions, และ Triggers คุณจำเป็นต้องใช้ PL/SQL ครับ
อ่านเพิ่มเติม