JavaRush /Курси /SQL SELF /Порівняння PL/pgSQL з іншими мовами процедурного програму...

Порівняння PL/pgSQL з іншими мовами процедурного програмування (PL/SQL, T-SQL)

SQL SELF
Рівень 49 , Лекція 2
Відкрита

У світі баз даних існує кілька мов, які розширюють можливості звичайного 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

На перший погляд, усі три мови здаються дуже схожими. І це не дивно, адже їхня задача одна й та сама — допомогти розробнику реалізувати бізнес-логіку всередині бази даних. Давай розглянемо основні схожості:

  1. Синтаксис блоків

    Усі три мови надають структурований формат написання процедурного коду. Основні елементи:

    • Оголошення змінних.
    • Основний блок виконання (BEGIN ... END).
    • Підтримка обробки виключень.
  2. Змінні

    Ти можеш оголошувати й використовувати змінні в будь-якій з цих мов. Приклад оголошення змінної в PL/pgSQL:

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

    Аналогічне можна зробити і в PL/SQL, і в T-SQL.

  3. Керуючі конструкції

    Усі мови підтримують IF...THEN, CASE, LOOP, FOR, WHILE, що дозволяє писати складні алгоритми.

  4. Функції та процедури

    Можливість створювати й викликати користувацькі функції та процедури, які можуть повертати як одиночні значення, так і таблиці.

Відмінності між 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. У кожної мови є свої особливості й сценарії застосування, які роблять її унікальною. Вибір мови (як і бази даних) завжди залежить від твоїх потреб і специфіки проєкту.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ