SQL (Structured Query Language) là ngôn ngữ khai báo chuẩn cho cơ sở dữ liệu quan hệ — chỉ định lấy/cập nhật cái gì. PL/SQL (Procedural Language/SQL) là ngôn ngữ thủ tục mở rộng của Oracle — thêm biến, vòng lặp, điều kiện, exception handling, cho phép viết logic nghiệp vụ phức tạp chạy ngay trên database server.
Bảng so sánh chi tiết
| # | Tiêu chí | SQL | PL/SQL |
| 1 | Định nghĩa | Ngôn ngữ truy vấn cấu trúc cho database | Ngôn ngữ lập trình dùng SQL cho database |
| 2 | Biến | Không có biến | Có biến, kiểu dữ liệu, hằng, record, collection |
| 3 | Cấu trúc điều khiển | Không có IF, LOOP, FOR | Có IF, CASE, FOR LOOP, WHILE LOOP, GOTO |
| 4 | Thực thi | Một câu lệnh một lần | Nhiều câu lệnh trong một khối (block) |
| 5 | Loại ngôn ngữ | Khai báo (Declarative) | Thủ tục (Procedural) |
| 6 | Nhúng lẫn nhau | SQL nhúng trong PL/SQL block | PL/SQL cũng có thể nhúng trong SQL (function trong SELECT) |
| 7 | Tương tác DB Server | Trực tiếp | Không trực tiếp (chạy trong PL/SQL engine) |
| 8 | Định hướng | Dữ liệu (Data-oriented) | Ứng dụng (Application-oriented) |
| 9 | Mục đích | Viết query, DDL, DML | Viết block, function, procedure, trigger, package |
Ví dụ minh họa
SQL thuần: Chỉ truy vấn
DECLARE
v_bonus_rate NUMBER := 0.10;
v_total_bonus NUMBER := 0;
BEGIN
FOR rec IN (SELECT EmployeeId, Salary FROM Employees WHERE DepartmentId = 10) LOOP
v_total_bonus := v_total_bonus + (rec.Salary * v_bonus_rate);
UPDATE Employees SET Bonus = rec.Salary * v_bonus_rate WHERE EmployeeId = rec.EmployeeId;
END LOOP;
INSERT INTO BonusLog (DeptId, TotalBonus, CalcDate) VALUES (10, v_total_bonus, SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
Kiến trúc thực thi
- SQL Engine: Phân tích, tối ưu, thực thi câu lệnh SQL đơn lẻ.
- PL/SQL Engine: Thực thi logic thủ tục, gọi SQL Engine cho các câu SQL bên trong. Giảm network round-trip giữa app và DB.
Tương đương ở các RDBMS khác
| RDBMS | Ngôn ngữ thủ tục |
| Oracle | PL/SQL |
| SQL Server | T-SQL |
| PostgreSQL | PL/pgSQL |
| MySQL | MySQL Stored Programs (SQL/PSM) |
| DB2 | SQL PL |
Khi nào dùng PL/SQL?
- Logic nghiệp vụ phức tạp: validation, tính toán nhiều bước, workflow.
- Cần transaction control tường minh (COMMIT/ROLLBACK/SAVEPOINT).
- Cần exception handling (TRY-CATCH).
- Hiệu năng: Gom nhiều SQL thành một lần gọi từ ứng dụng.
- Bảo mật: Ẩn logic, chỉ cấp quyền EXECUTE trên procedure.