У світі баз даних існує кілька мов, які розширюють можливості звичайного SQL і дозволяють писати повноцінну бізнес-логіку прямо всередині СУБД. Кожна з них заточена під свою платформу, але загалом вони вирішують схожі задачі — автоматизувати, спростити й прискорити роботу з даними. Серед таких мов — PL/pgSQL для PostgreSQL, PL/SQL для Oracle і T-SQL для SQL Server. У кожної є свої особливості, переваги й нюанси, про які зараз і поговоримо.
PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — це процедурна мова програмування, інтегрована в PostgreSQL. Її основна задача — розширити функціональність SQL, надавши розробникам можливості роботи зі змінними, циклами, керуючими конструкціями та блоком обробки помилок. Це робить мову потужним інструментом для реалізації складної бізнес-логіки на стороні бази даних.
PL/SQL (Procedural Language/SQL) — мова процедурного програмування, вбудована в СУБД Oracle. Вона надає аналогічні можливості для обробки даних і створення процедур, функцій і пакетів. PL/SQL вважається дуже зрілою мовою завдяки своїм десятиліттям розвитку і багатій екосистемі інструментів.
T-SQL (Transact-SQL) — мова, розроблена компанією Microsoft для роботи з SQL Server. Це розширення стандартного SQL, яке включає підтримку змінних, керуючих конструкцій та інших елементів процедурного програмування. T-SQL має свої особливості в області транзакцій, роботи з курсорами й обробки JSON.
Схожості між PL/pgSQL, PL/SQL і T-SQL
На перший погляд, усі три мови здаються дуже схожими. І це не дивно, адже їхня задача одна й та сама — допомогти розробнику реалізувати бізнес-логіку всередині бази даних. Давай розглянемо основні схожості:
Синтаксис блоків
Усі три мови надають структурований формат написання процедурного коду. Основні елементи:
- Оголошення змінних.
- Основний блок виконання (
BEGIN ... END). - Підтримка обробки виключень.
Змінні
Ти можеш оголошувати й використовувати змінні в будь-якій з цих мов. Приклад оголошення змінної в PL/pgSQL:
DECLARE student_id INT; BEGIN student_id := 10; END;Аналогічне можна зробити і в PL/SQL, і в T-SQL.
Керуючі конструкції
Усі мови підтримують
IF...THEN,CASE,LOOP,FOR,WHILE, що дозволяє писати складні алгоритми.Функції та процедури
Можливість створювати й викликати користувацькі функції та процедури, які можуть повертати як одиночні значення, так і таблиці.
Відмінності між PL/pgSQL, PL/SQL і T-SQL
Розробники часто стикаються з ситуаціями, коли треба перейти з однієї бази даних на іншу. У таких випадках важливо знати нюанси мов. Розберемо ключові відмінності.
Оголошення змінних
PL/pgSQL: змінні оголошуються в блоці DECLARE. Для присвоєння значень використовується :=.
DECLARE
total_students INT;
BEGIN
total_students := 5;
END;
PL/SQL: оголошення аналогічне PL/pgSQL, але тип змінної може бути успадкований від стовпця таблиці за допомогою %TYPE.
DECLARE
student_name students.name%TYPE;
BEGIN
student_name := 'John';
END;
T-SQL: змінні оголошуються за допомогою ключового слова DECLARE, присвоєння — через SET або SELECT.
DECLARE @total_students INT;
SET @total_students = 5; -- або
SELECT @total_students = COUNT(*) FROM students;
Обробка помилок
PL/pgSQL: використовує блок EXCEPTION для обробки помилок. Наприклад:
BEGIN
SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
WHEN others THEN
RAISE NOTICE 'Виникла помилка!';
END;
PL/SQL: також використовує EXCEPTION, але з більш детальною класифікацією помилок.
BEGIN
SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Дані не знайдено!');
END;
T-SQL: використовує конструкції TRY...CATCH.
BEGIN TRY
SELECT 1/0; -- Помилка ділення на нуль
END TRY
BEGIN CATCH
PRINT 'Виникла помилка!';
END CATCH;
Робота з курсорами
PL/pgSQL: курсори є неявними і можуть задаватися в циклах.
FOR row IN SELECT * FROM students LOOP
RAISE NOTICE 'Студент: %', row.name;
END LOOP;
PL/SQL: курсори є явно оголошуваними структурами. Наприклад:
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: курсори оголошуються через ключове слово CURSOR.
DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;
Робота з транзакціями
PL/pgSQL: транзакції керуються через команди BEGIN, COMMIT, ROLLBACK.
PL/SQL: транзакції аналогічно керуються через COMMIT, ROLLBACK, з підтримкою SAVEPOINT.
T-SQL: додається підтримка BEGIN TRANSACTION для позначення початку транзакції.
JSON-підтримка
PL/pgSQL: потужна робота з JSON через типи даних JSON і JSONB. Приклад:
SELECT data->>'key' FROM json_table;
PL/SQL: підтримка JSON реалізована пізніше і трохи менш гнучка.
T-SQL: дуже зручна робота з JSON через функції JSON_QUERY, JSON_VALUE.
Коли використовувати PL/pgSQL, PL/SQL або T-SQL?
PL/pgSQL:
- Вибір очевидний, якщо твоя база даних — PostgreSQL.
- Чудово підходить для обробки великих обсягів даних завдяки підтримці потужних типів даних (
JSONB, масиви). - Відкрита екосистема, гнучкість.
PL/SQL:
- Вибір для продуктів Oracle.
- Багата екосистема для роботи з даними (пакети, вбудовані процедури).
T-SQL:
- Використовується в Microsoft SQL Server.
- Ідеальний для роботи з додатками Microsoft та інтеграції в стек Microsoft Azure.
Приклад однієї й тієї ж задачі в PL/pgSQL, PL/SQL і T-SQL
Задача: порахувати кількість студентів і повернути результат
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;
Тепер ти знаєш приблизну різницю між PL/pgSQL, PL/SQL і T-SQL. У кожної мови є свої особливості й сценарії застосування, які роблять її унікальною. Вибір мови (як і бази даних) завжди залежить від твоїх потреб і специфіки проєкту.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ