CodeGym /Các khóa học /SQL SELF /Các tính năng chính của PL/pgSQL

Các tính năng chính của PL/pgSQL

SQL SELF
Mức độ , Bài học
Có sẵn

Ok, cùng đào sâu vào những gì làm cho PL/pgSQL trở thành một công cụ mạnh mẽ và không thể thiếu cho dev và admin database nhé. Trong bài này tụi mình sẽ nói về ưu điểm của PL/pgSQL, các tính năng độc đáo của nó và xem qua các ví dụ để thấy mấy cái này hữu ích thế nào ngoài đời thực.

Để hiểu tại sao cần PL/pgSQL, thử tưởng tượng bạn đang ở một thế giới mà mọi task lập trình đều phải làm chỉ bằng SQL thôi. Ví dụ, để đếm số lượng sinh viên theo từng khoa, bạn sẽ phải viết một truy vấn SQL phức tạp rồi xử lý kết quả ở phía client. Không hiệu quả lắm nhỉ? Đó là lúc PL/pgSQL xuất hiện với support cho biến, vòng lặp, điều kiện và xử lý lỗi.

Ưu điểm khi dùng PL/pgSQL:

  1. Logic phía server: PL/pgSQL giúp giảm lượng data truyền giữa server và client vì toàn bộ logic chạy trên server luôn. Như vậy giảm được độ trễ mạng.
  2. Hiệu năng: function viết bằng PL/pgSQL được compile và lưu trong database, nên chạy nhanh hơn nhiều so với việc thực hiện từng truy vấn SQL riêng lẻ.
  3. Tự động hóa task: với PL/pgSQL bạn có thể tự động hóa các thao tác lặp đi lặp lại như update data, ghi log hay kiểm tra tính toàn vẹn thông tin.
  4. Logic kinh doanh: PL/pgSQL cho phép hiện thực hóa các logic kinh doanh phức tạp như tính toán, kiểm tra hay tạo báo cáo phân tích.
  5. Dễ đọc và bảo trì: code PL/pgSQL dễ tổ chức, chia nhỏ thành function và cải tiến, nên rất tiện cho việc bảo trì.

Lĩnh vực ứng dụng của PL/pgSQL

Giờ cùng xem thử PL/pgSQL dùng được ở đâu và nó giải quyết các bài toán thực tế như thế nào nhé.

  1. Tự động hóa các thao tác lặp lại

PL/pgSQL giúp tự động hóa các task lặp đi lặp lại. Ví dụ, bạn cần update một số data mỗi ngày hoặc định kỳ chạy phân tích. Viết một function bằng PL/pgSQL, bạn có thể dễ dàng tích hợp nó với task scheduler (ví dụ pg_cron) để chạy vào thời gian định sẵn.

Ví dụ: tự động update trạng thái

CREATE FUNCTION update_student_status() RETURNS VOID AS $$
BEGIN
    UPDATE students
    SET status = 'không hoạt động'
    WHERE last_login < NOW() - INTERVAL '1 year';
    RAISE NOTICE 'Trạng thái sinh viên đã được cập nhật.';
END;
$$ LANGUAGE plpgsql;

Function này, ví dụ, sẽ tự động đặt trạng thái "không hoạt động" cho sinh viên nào không đăng nhập hơn một năm.

  1. Tạo báo cáo

PL/pgSQL rất hợp để tạo các báo cáo phân tích, nơi cần tổng hợp và kết hợp data từ nhiều bảng. Bạn có thể tạo procedure để tự động sinh báo cáo và ghi vào bảng riêng.

Ví dụ: tạo báo cáo số lượng sinh viên theo khoa

CREATE FUNCTION generate_faculty_report() RETURNS TABLE (faculty_id INT, student_count INT) AS $$
BEGIN
    RETURN QUERY
    SELECT faculty_id, COUNT(*)
    FROM students
    GROUP BY faculty_id;
END;
$$ LANGUAGE plpgsql;

Sau khi gọi function này bạn sẽ nhận được thống kê cho tất cả các khoa.

  1. Ghi log thay đổi trong bảng

Ghi log là quá trình lưu lại các thay đổi data trong bảng database. PL/pgSQL giúp bạn làm việc này hiệu quả, ví dụ bằng trigger.

Ví dụ function ghi log thay đổi

CREATE FUNCTION log_changes() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO change_logs(table_name, operation, old_data, new_data, changed_at)
    VALUES (TG_TABLE_NAME, TG_OP, ROW_TO_JSON(OLD), ROW_TO_JSON(NEW), NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Function này ghi vào bảng change_logs thông tin về bảng nào bị thay đổi, thao tác gì (ví dụ INSERT, UPDATE, DELETE), và lưu lại data cũ và mới.

  1. Hiện thực thuật toán phức tạp

Với PL/pgSQL bạn có thể code các thuật toán vượt ngoài khả năng của SQL chuẩn. Ví dụ như tính toán chi phí, kiểm tra rule kinh doanh hay tự động sinh mã định danh.

Ví dụ: sinh mã định danh duy nhất

CREATE FUNCTION generate_unique_id() RETURNS TEXT AS $$
BEGIN
    RETURN CONCAT('UID-', EXTRACT(EPOCH FROM NOW()), '-', RANDOM()::TEXT);
END;
$$ LANGUAGE plpgsql;

Function này tạo ra một mã định danh duy nhất bằng cách ghép timestamp hiện tại và một số random.

  1. Làm việc với trigger

Trigger và PL/pgSQL là cặp đôi hoàn hảo. Khi bạn cần tự động hóa một task nào đó, ví dụ update data liên quan, trigger với function PL/pgSQL là công cụ lý tưởng.

Ví dụ: trigger khi xóa sinh viên

CREATE FUNCTION handle_delete_students() RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM enrollments WHERE student_id = OLD.id;
    RAISE NOTICE 'Đã xóa enrollments cho sinh viên %.', OLD.id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

Dùng function này, bạn có thể tự động xóa các bản ghi enrollments của sinh viên trong bảng enrollments nếu sinh viên bị xóa khỏi bảng students.

  1. Xử lý lỗi

Khi làm việc với các task phức tạp, xử lý lỗi là cực kỳ quan trọng. PL/pgSQL cung cấp block EXCEPTION để bắt và xử lý lỗi.

Ví dụ: xử lý lỗi

CREATE FUNCTION insert_student(name TEXT, faculty_id INT) RETURNS VOID AS $$
BEGIN
    INSERT INTO students(name, faculty_id) VALUES (name, faculty_id);
EXCEPTION
    WHEN FOREIGN_KEY_VIOLATION THEN
        RAISE NOTICE 'Faculty ID % không tồn tại!', faculty_id;
END;
$$ LANGUAGE plpgsql;

Ở đây, nếu có lỗi nhập faculty không tồn tại trong database, sẽ hiện cảnh báo thay vì crash luôn.

Ví dụ về các bài toán phức tạp giải bằng PL/pgSQL

Để truyền cảm hứng cho bạn dùng PL/pgSQL, đây là vài ví dụ về các bài toán mà nó giúp giải quyết:

  1. Tự động cập nhật giảm giá trong shop online Function tự động update giảm giá cho sản phẩm hết hạn khuyến mãi mỗi ngày.

  2. Kiểm tra và sửa dữ liệu Function kiểm tra bảng có bản ghi trùng không và xóa luôn nếu có.

  3. Chuyển đổi cấu hình nhanh Function cho phép đổi tham số hệ thống, ví dụ chuyển chế độ hoạt động của app.

Ví dụ thực tế trong thế giới IT

PL/pgSQL được hàng triệu công ty trên toàn thế giới sử dụng. Ví dụ:

  • Shop online dùng function để tính thuế, tự động update giảm giá và tạo báo cáo bán hàng.
  • Ngân hàng dùng PL/pgSQL để xử lý hàng ngàn giao dịch mỗi ngày, từ tính lãi đến kiểm tra điểm tín dụng.
  • Mạng xã hội triển khai các thuật toán xử lý data phức tạp, ví dụ gợi ý bạn bè.

PL/pgSQL giống như con dao đa năng cho dev làm việc với PostgreSQL vậy. Nó không chỉ giúp việc với database dễ dàng hơn mà còn cho phép hiện thực các task mà SQL thường rất khó hoặc không làm được. Và quan trọng nhất — PL/pgSQL học rất nhanh, ai cũng có thể trở thành master database với nó luôn.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION