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 считается очень зрелым языком благодаря своим decades of refinement и богатой экосистеме инструментов.

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 'An error occurred!';
END;

PL/SQL: также использует EXCEPTION, но с более детальной классификацией ошибок.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('No data found!');
END;

T-SQL: использует конструкции TRY...CATCH.

BEGIN TRY
    SELECT 1/0; -- Ошибка деления на ноль
END TRY
BEGIN CATCH
    PRINT 'An error occurred!';
END CATCH;

Работа с курсорами

PL/pgSQL: курсоры являются неявными и могут задаваться в циклах.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE 'Student: %', 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. У каждого языка есть свои особенности и сценарии применения, которые делают его уникальным. Выбор языка (как и базы данных) всегда зависит от ваших потребностей и специфики проекта.

2
Задача
SQL SELF, 49 уровень, 2 лекция
Недоступна
Создание простой функции для подсчёта строк
Создание простой функции для подсчёта строк
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ