PostgreSQL không chỉ "nói chuyện" bằng SQL đâu nhé! Làm quen đi: PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language), một ngôn ngữ lập trình thủ tục được tích hợp sẵn trong PostgreSQL. Nó được tạo ra để giúp bạn thực hiện các thao tác phức tạp bằng cách dùng các truy vấn SQL cùng với các cấu trúc điều khiển như điều kiện (IF, CASE) và vòng lặp (LOOP, FOR, WHILE).
PL/pgSQL và SQL — giống như dây chuyền lắp ráp tự động và dụng cụ "thủ công" kiểu như cái búa vậy. SQL thì giống cái búa: đáng tin cậy, nhưng mỗi lần đóng đinh là phải tự vung tay lên. Còn PL/pgSQL thì như dây chuyền tự động: bạn chỉ cần set up một lần, mọi thứ tự chạy — thực hiện lệnh, nhớ giá trị, kiểm tra lỗi, nếu có gì sai thì vẫn tiếp tục chạy bình thường. Đóng từng cái đinh làm gì cho mệt, ngồi nhìn máy nó làm hết không phải sướng hơn à?
So sánh PL/pgSQL với các truy vấn SQL thông thường
Cùng xem PL/pgSQL khác gì so với các truy vấn SQL đơn giản nhé.
SQL rất ổn khi bạn chỉ cần làm một việc cụ thể: ví dụ, lấy danh sách tất cả sinh viên từ bảng hoặc thêm một dòng mới. Nhưng khi bạn bắt đầu gặp các logic kiểu "nếu thế này thì làm thế kia" hoặc phải lặp đi lặp lại một thao tác, SQL bắt đầu đuối rồi đó.
Ví dụ, thử tưởng tượng bạn cần:
- Kiểm tra xem đã có bản ghi về sinh viên trong bảng chưa.
- Nếu có rồi — cập nhật dữ liệu.
- Nếu chưa có — thêm bản ghi mới.
Bằng SQL thông thường, bạn sẽ phải viết nhiều truy vấn và xử lý kết quả ở phía client. Với PL/pgSQL, bạn gom hết vào một procedure, chạy ngay trong database luôn.
PL/pgSQL cực kỳ hữu ích trong các project phức tạp hơn. Nó cho phép bạn:
- lưu kết quả tạm vào biến;
- xử lý lỗi để database không bị "sập" khi có sự cố bất ngờ;
- dùng vòng lặp và điều kiện để thực hiện các thuật toán phức tạp.
Ứng dụng của PL/pgSQL
PL/pgSQL thường được dùng trong các trường hợp sau:
Tự động hóa công việc. Ví dụ, tự động tạo bản ghi trong nhật ký (
log) mỗi khi dữ liệu được cập nhật.Business logic. Bạn có rule: mỗi sinh viên mà nghỉ quá 5 buổi thì tự động bị đánh dấu là "không hoạt động". Sao không cho rule này vào function PL/pgSQL luôn nhỉ?
Phân tích và báo cáo. Thay vì chuyển dữ liệu qua lại giữa database và app client, bạn có thể tổng hợp ngay trên server.
Trigger. PL/pgSQL dùng để viết trigger, tự động thực hiện thao tác khi có insert, update hoặc delete dữ liệu.
Ví dụ sử dụng PL/pgSQL
Đây là ví dụ về function nhận hai số, cộng lại và trả về kết quả:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
Giải thích:
CREATE FUNCTION add_numbers(a INT, b INT)— mình tạo function tên làadd_numbers, nhận hai tham số kiểuINT(số nguyên).RETURNS INT— chỉ ra rằng function trả về một số nguyên.BEGIN ... END— đây là block chính, nơi logic function được thực thi.RETURN a + b;— trả về kết quả phép cộng.
Để gọi function này, chỉ cần dùng truy vấn SQL bình thường:
SELECT add_numbers(10, 20);
Kết quả: 30.
Lưu ý và hạn chế
PL/pgSQL — công cụ mạnh mẽ, nhưng cũng phải cẩn thận khi dùng nhé:
- Hiệu năng: function quá phức tạp có thể làm database chạy chậm. Luôn test và tối ưu hóa.
- Kiểm thử: lỗi trong function có thể không lộ ra cho đến khi bạn gọi nó. Đừng quên viết test nha!
- Dễ đọc: function và procedure dài, logic phức tạp sẽ khó đọc lắm. Viết code sao cho tháng sau đọc lại vẫn hiểu nhé.
Giờ bạn đã biết sơ sơ về PL/pgSQL rồi, tiếp theo mình sẽ nói về cú pháp và các tính năng cơ bản của nó. Chúng ta sẽ học cách tạo block code, khai báo biến và làm việc với kiểu dữ liệu trong các bài sau. Tiến lên lập trình phía database nào!
GO TO FULL VERSION