CodeGym /Kursy /SQL SELF /Porównanie PL/pgSQL z innymi językami proceduralnymi (PL/...

Porównanie PL/pgSQL z innymi językami proceduralnymi (PL/SQL, T-SQL)

SQL SELF
Poziom 49 , Lekcja 2
Dostępny

W świecie baz danych istnieje kilka języków, które rozszerzają możliwości zwykłego SQL i pozwalają pisać pełnoprawną logikę biznesową bezpośrednio w bazie danych. Każdy z nich jest dostosowany do swojej platformy, ale generalnie rozwiązują podobne zadania — automatyzują, upraszczają i przyspieszają pracę z danymi. Do takich języków należą: PL/pgSQL dla PostgreSQL, PL/SQL dla Oracle i T-SQL dla SQL Server. Każdy z nich ma swoje cechy, zalety i niuanse, o których teraz pogadamy.

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — to proceduralny język programowania zintegrowany z PostgreSQL. Jego głównym zadaniem jest rozszerzenie funkcjonalności SQL, dając programistom możliwość pracy ze zmiennymi, pętlami, konstrukcjami sterującymi i blokiem obsługi błędów. To sprawia, że język jest potężnym narzędziem do realizacji złożonej logiki biznesowej po stronie bazy danych.

PL/SQL (Procedural Language/SQL) — proceduralny język programowania wbudowany w bazę Oracle. Daje podobne możliwości do przetwarzania danych i tworzenia procedur, funkcji oraz pakietów. PL/SQL jest uważany za bardzo dojrzały język dzięki swoim dekadom rozwoju i bogatemu ekosystemowi narzędzi.

T-SQL (Transact-SQL) — język stworzony przez Microsoft do pracy z SQL Server. To rozszerzenie standardowego SQL, obejmujące wsparcie dla zmiennych, konstrukcji sterujących i innych elementów programowania proceduralnego. T-SQL ma swoje cechy w zakresie transakcji, pracy z kursorem i obsługi JSON.

Podobieństwa między PL/pgSQL, PL/SQL i T-SQL

Na pierwszy rzut oka wszystkie trzy języki wydają się bardzo podobne. I nic dziwnego, bo ich zadanie jest to samo — pomóc programiście wdrożyć logikę biznesową w bazie danych. Zobaczmy główne podobieństwa:

  1. Składnia bloków

    Wszystkie trzy języki oferują strukturalny format pisania kodu proceduralnego. Główne elementy:

    • Deklaracja zmiennych.
    • Główny blok wykonania (BEGIN ... END).
    • Wsparcie dla obsługi wyjątków.
  2. Zmienne

    Możesz deklarować i używać zmiennych w każdym z tych języków. Przykład deklaracji zmiennej w PL/pgSQL:

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

    Podobnie można zrobić w PL/SQL i T-SQL.

  3. Konstrukcje sterujące

    Wszystkie języki wspierają IF...THEN, CASE, LOOP, FOR, WHILE, co pozwala pisać złożone algorytmy.

  4. Funkcje i procedury

    Możliwość tworzenia i wywoływania własnych funkcji i procedur, które mogą zwracać zarówno pojedyncze wartości, jak i tabele.

Różnice między PL/pgSQL, PL/SQL i T-SQL

Programiści często spotykają się z sytuacjami, gdy trzeba przejść z jednej bazy danych na inną. W takich przypadkach ważne jest, aby znać niuanse języków. Przeanalizujmy kluczowe różnice.

Deklaracja zmiennych

PL/pgSQL: zmienne deklaruje się w bloku DECLARE. Do przypisania wartości używa się :=.

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

PL/SQL: deklaracja podobna do PL/pgSQL, ale typ zmiennej może być odziedziczony po kolumnie tabeli za pomocą %TYPE.

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

T-SQL: zmienne deklaruje się za pomocą słowa kluczowego DECLARE, przypisanie — przez SET lub SELECT.

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

Obsługa błędów

PL/pgSQL: używa bloku EXCEPTION do obsługi błędów. Przykład:

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE 'Wystąpił błąd!';
END;

PL/SQL: również używa EXCEPTION, ale z bardziej szczegółową klasyfikacją błędów.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Nie znaleziono danych!');
END;

T-SQL: używa konstrukcji TRY...CATCH.

BEGIN TRY
    SELECT 1/0; -- Błąd dzielenia przez zero
END TRY
BEGIN CATCH
    PRINT 'Wystąpił błąd!';
END CATCH;

Praca z kursorem

PL/pgSQL: kursory są niejawne i mogą być używane w pętlach.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE 'Student: %', row.name;
END LOOP;

PL/SQL: kursory są jawnie deklarowanymi strukturami. Przykład:

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: kursory deklaruje się przez słowo kluczowe CURSOR.

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

Praca z transakcjami

PL/pgSQL: transakcjami zarządza się przez polecenia BEGIN, COMMIT, ROLLBACK.

PL/SQL: transakcje zarządzane są podobnie przez COMMIT, ROLLBACK, z obsługą SAVEPOINT.

T-SQL: dodaje wsparcie dla BEGIN TRANSACTION do oznaczenia początku transakcji.

Wsparcie dla JSON

PL/pgSQL: potężna praca z JSON przez typy danych JSON i JSONB. Przykład:

SELECT data->>'key' FROM json_table;

PL/SQL: wsparcie dla JSON pojawiło się później i jest trochę mniej elastyczne.

T-SQL: bardzo wygodna praca z JSON przez funkcje JSON_QUERY, JSON_VALUE.

Kiedy używać PL/pgSQL, PL/SQL lub T-SQL?

PL/pgSQL:

  • Wybór oczywisty, jeśli Twoja baza to PostgreSQL.
  • Świetnie nadaje się do przetwarzania dużych ilości danych dzięki wsparciu dla potężnych typów danych (JSONB, tablice).
  • Otwarty ekosystem, elastyczność.

PL/SQL:

  • Wybór dla produktów Oracle.
  • Bogaty ekosystem do pracy z danymi (pakiety, wbudowane procedury).

T-SQL:

  • Używany w Microsoft SQL Server.
  • Idealny do pracy z aplikacjami Microsoft i integracji ze stackiem Microsoft Azure.

Przykład tego samego zadania w PL/pgSQL, PL/SQL i T-SQL

Zadanie: policzyć liczbę studentów i zwrócić wynik

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;

Teraz już wiesz, jaka jest różnica między PL/pgSQL, PL/SQL i T-SQL. Każdy język ma swoje cechy i scenariusze użycia, które czynią go wyjątkowym. Wybór języka (tak jak i bazy danych) zawsze zależy od Twoich potrzeb i specyfiki projektu.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION