CodeGym /Các khóa học /SQL SELF /So sánh PL/pgSQL với các ngôn ngữ lập trình thủ tục khác ...

So sánh PL/pgSQL với các ngôn ngữ lập trình thủ tục khác (PL/SQL, T-SQL)

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

Trong thế giới database, có vài ngôn ngữ mở rộng khả năng của SQL thông thường và cho phép tụi mình viết logic nghiệp vụ ngay trong DBMS. Mỗi ngôn ngữ này được thiết kế cho nền tảng riêng, nhưng nhìn chung đều giải quyết các bài toán giống nhau — tự động hóa, đơn giản hóa và tăng tốc xử lý dữ liệu. Một số ngôn ngữ tiêu biểu là PL/pgSQL cho PostgreSQL, PL/SQL cho Oracle và T-SQL cho SQL Server. Mỗi cái đều có đặc điểm, ưu điểm và những thứ cần lưu ý riêng, giờ mình sẽ nói kỹ hơn nhé.

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — là ngôn ngữ lập trình thủ tục tích hợp trong PostgreSQL. Nhiệm vụ chính của nó là mở rộng khả năng của SQL, cho dev thao tác với biến, vòng lặp, cấu trúc điều khiển và khối xử lý lỗi. Nhờ vậy, ngôn ngữ này cực mạnh để hiện thực logic nghiệp vụ phức tạp ngay phía database.

PL/SQL (Procedural Language/SQL) — ngôn ngữ lập trình thủ tục tích hợp trong DBMS Oracle. Nó cung cấp khả năng tương tự để xử lý dữ liệu, tạo procedure, function và package. PL/SQL được coi là rất trưởng thành nhờ nhiều năm phát triển và hệ sinh thái tool cực kỳ phong phú.

T-SQL (Transact-SQL) — ngôn ngữ do Microsoft phát triển cho SQL Server. Đây là mở rộng của SQL chuẩn, bổ sung hỗ trợ biến, cấu trúc điều khiển và các thành phần lập trình thủ tục khác. T-SQL có những đặc điểm riêng về transaction, làm việc với con trỏ và xử lý JSON.

Điểm giống nhau giữa PL/pgSQL, PL/SQL và T-SQL

Nhìn sơ qua thì ba ngôn ngữ này khá giống nhau. Không có gì lạ, vì mục tiêu của chúng đều là giúp dev hiện thực logic nghiệp vụ ngay trong database. Cùng xem qua các điểm giống nhau chính nhé:

  1. Cú pháp khối lệnh

    Cả ba ngôn ngữ đều cung cấp cấu trúc code thủ tục rõ ràng. Các thành phần chính:

    • Khai báo biến.
    • Khối thực thi chính (BEGIN ... END).
    • Hỗ trợ xử lý ngoại lệ.
  2. Biến

    Bạn có thể khai báo và dùng biến trong bất kỳ ngôn ngữ nào trong ba cái này. Ví dụ khai báo biến trong PL/pgSQL:

    DECLARE
        student_id INT;
    BEGIN
        student_id := 10;
    END;
    

    Tương tự cũng làm được trong PL/SQL và T-SQL.

  3. Cấu trúc điều khiển

    Cả ba ngôn ngữ đều hỗ trợ IF...THEN, CASE, LOOP, FOR, WHILE, cho phép bạn viết thuật toán phức tạp.

  4. Function và procedure

    Có thể tạo và gọi function, procedure tự định nghĩa, trả về giá trị đơn hoặc bảng.

Điểm khác nhau giữa PL/pgSQL, PL/SQL và T-SQL

Dev thường gặp tình huống phải chuyển từ DB này sang DB khác. Khi đó, biết rõ các khác biệt là rất quan trọng. Cùng phân tích các điểm khác biệt chính nhé.

Khai báo biến

PL/pgSQL: biến khai báo trong khối DECLARE. Gán giá trị dùng :=.

DECLARE
    total_students INT;
BEGIN
    total_students := 5;
END;

PL/SQL: khai báo tương tự PL/pgSQL, nhưng kiểu biến có thể kế thừa từ cột bảng bằng %TYPE.

DECLARE
    student_name students.name%TYPE;
BEGIN
    student_name := 'John';
END;

T-SQL: biến khai báo bằng từ khóa DECLARE, gán giá trị qua SET hoặc SELECT.

DECLARE @total_students INT;
SET @total_students = 5;  -- hoặc
SELECT @total_students = COUNT(*) FROM students;

Xử lý lỗi

PL/pgSQL: dùng khối EXCEPTION để xử lý lỗi. Ví dụ:

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE 'Đã xảy ra lỗi!';
END;

PL/SQL: cũng dùng EXCEPTION, nhưng phân loại lỗi chi tiết hơn.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Không tìm thấy dữ liệu!');
END;

T-SQL: dùng cấu trúc TRY...CATCH.

BEGIN TRY
    SELECT 1/0; -- Lỗi chia cho 0
END TRY
BEGIN CATCH
    PRINT 'Đã xảy ra lỗi!';
END CATCH;

Làm việc với con trỏ

PL/pgSQL: con trỏ là ẩn, có thể dùng trực tiếp trong vòng lặp.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE 'Sinh viên: %', row.name;
END LOOP;

PL/SQL: con trỏ phải khai báo rõ ràng. Ví dụ:

DECLARE
    CURSOR student_cursor IS SELECT * FROM students;
    student_row students%ROWTYPE;
BEGIN
    OPEN student_cursor;
    FETCH student_cursor INTO student_row;
    CLOSE student_cursor;
END;

T-SQL: con trỏ khai báo bằng từ khóa CURSOR.

DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;

Làm việc với transaction

PL/pgSQL: transaction điều khiển qua lệnh BEGIN, COMMIT, ROLLBACK.

PL/SQL: transaction cũng điều khiển qua COMMIT, ROLLBACK, có hỗ trợ SAVEPOINT.

T-SQL: bổ sung BEGIN TRANSACTION để đánh dấu bắt đầu transaction.

Hỗ trợ JSON

PL/pgSQL: làm việc với JSON cực mạnh qua kiểu dữ liệu JSON và JSONB. Ví dụ:

SELECT data->>'key' FROM json_table;

PL/SQL: hỗ trợ JSON xuất hiện muộn hơn và hơi hạn chế.

T-SQL: làm việc với JSON rất tiện qua các hàm JSON_QUERY, JSON_VALUE.

Khi nào dùng PL/pgSQL, PL/SQL hoặc T-SQL?

PL/pgSQL:

  • Lựa chọn hiển nhiên nếu DB của bạn là PostgreSQL.
  • Rất hợp để xử lý dữ liệu lớn nhờ hỗ trợ kiểu dữ liệu mạnh (JSONB, mảng).
  • Hệ sinh thái mở, linh hoạt.

PL/SQL:

  • Lựa chọn cho sản phẩm Oracle.
  • Hệ sinh thái phong phú để thao tác dữ liệu (package, procedure tích hợp).

T-SQL:

  • Dùng trong Microsoft SQL Server.
  • Lý tưởng cho ứng dụng Microsoft và tích hợp vào stack Microsoft Azure.

Ví dụ cùng một bài toán trên PL/pgSQL, PL/SQL và T-SQL

Bài toán: đếm số lượng sinh viên và trả về kết quả

PL/pgSQL:

CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
    total INT;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;
$$ LANGUAGE plpgsql;

PL/SQL:

CREATE OR REPLACE FUNCTION count_students RETURN NUMBER IS
    total NUMBER;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;

T-SQL:

CREATE FUNCTION count_students()
RETURNS INT
AS
BEGIN
    DECLARE @total INT;
    SELECT @total = COUNT(*) FROM students;
    RETURN @total;
END;

Giờ thì bạn đã biết sơ bộ sự khác nhau giữa PL/pgSQL, PL/SQL và T-SQL rồi nhé. Mỗi ngôn ngữ đều có đặc điểm và tình huống sử dụng riêng, làm cho nó trở nên độc đáo. Việc chọn ngôn ngữ (và cả DB) luôn phụ thuộc vào nhu cầu và đặc thù dự án của bạn.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo một hàm đơn giản để đếm số dòng
Tạo một hàm đơn giản để đếm số dòng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION