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:
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.
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.
Konstrukcje sterujące
Wszystkie języki wspierają
IF...THEN,CASE,LOOP,FOR,WHILE, co pozwala pisać złożone algorytmy.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.
GO TO FULL VERSION