PL/pgSQL là một ngôn ngữ lập trình thủ tục được sử dụng trong PostgreSQL để tạo các hàm và thủ tục lưu trữ (stored procedures). Nó cho phép người dùng viết mã phức tạp và thực hiện logic kinh doanh ngay trong cơ sở dữ liệu. Bài viết này sẽ giải thích chi tiết về PL/pgSQL, từ cơ bản đến nâng cao, giúp bạn hiểu rõ và áp dụng nó vào công việc của mình.
PL/pgSQL (Procedural Language/PostgreSQL) là ngôn ngữ mở rộng của SQL, được thiết kế để kết hợp tính ngắn gọn của SQL và khả năng lập trình của các ngôn ngữ thủ tục như PL/SQL trong Oracle hay Transact-SQL trong SQL Server.
Để bắt đầu, chúng ta sẽ tạo một hàm đơn giản nhất bằng PL/pgSQL để hiểu về cú pháp. Ví dụ dưới đây tạo ra một hàm để cộng hai số.
-- Người tạo: vnengineer CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER) RETURNS INTEGER AS $ BEGIN RETURN a + b; END; $ LANGUAGE plpgsql;
Sau khi hàm được tạo, bạn có thể gọi nó như sau:
SELECT add_numbers(10, 20); -- Kết quả sẽ là 30
PL/pgSQL cho phép bạn khai báo biến và sử dụng các khối lệnh để xây dựng logic phức tạp. Ví dụ dưới đây trình bày cách tính tổng của một dãy số từ 1 đến N.
-- Người tạo: vnengineer CREATE OR REPLACE FUNCTION sum_series(n INTEGER) RETURNS INTEGER AS $ DECLARE result INTEGER := 0; BEGIN FOR i IN 1..n LOOP result := result + i; END LOOP; RETURN result; END; $ LANGUAGE plpgsql;
Bạn có thể gọi hàm như sau:
SELECT sum_series(10); -- Kết quả sẽ là 55
PL/pgSQL cũng hỗ trợ xử lý ngoại lệ giúp mã của bạn trở nên mạnh mẽ và đáng tin cậy. Ví dụ, hàm dưới đây bắt một ngoại lệ khi chia cho số 0.
-- Người tạo: vnengineer CREATE OR REPLACE FUNCTION safe_divide(a INTEGER, b INTEGER) RETURNS FLOAT AS $ DECLARE result FLOAT; BEGIN BEGIN result := a / b; EXCEPTION WHEN division_by_zero THEN RAISE NOTICE 'Cannot divide by zero, returning NULL'; result := NULL; END; RETURN result; END; $ LANGUAGE plpgsql;
Bạn có thể gọi hàm như sau:
SELECT safe_divide(10, 0); -- Kết quả sẽ là NULL và hiển thị thông báo "Cannot divide by zero, returning NULL"
Ví dụ này minh họa cách tạo hàm trả về nhiều hàng dữ liệu thay vì chỉ một giá trị đơn lẻ.
-- Người tạo: vnengineer CREATE OR REPLACE FUNCTION get_employees_by_department(dept_id INTEGER) RETURNS TABLE(emp_name VARCHAR, emp_salary INTEGER) AS $ BEGIN RETURN QUERY SELECT name, salary FROM employees WHERE department_id = dept_id; END; $ LANGUAGE plpgsql;
Gọi hàm để lấy danh sách nhân viên của một bộ phận:
SELECT * FROM get_employees_by_department(101);
PL/pgSQL là một công cụ mạnh mẽ trong PostgreSQL, giúp bạn thực hiện các tác vụ phức tạp và xây dựng logic kinh doanh ngay trong cơ sở dữ liệu. Qua bài viết này, chúng ta đã tìm hiểu cơ bản cũng như những kỹ thuật nâng cao trong việc sử dụng PL/pgSQL. Hi vọng bạn có thể áp dụng những kiến thức này vào công việc của mình một cách hiệu quả.