При работе с реляционными базами данных, выбор языка для написания хранимых процедур, функций и триггеров имеет большое значение. PL/SQL (Procedural Language/Structured Query Language) от Oracle и SQL/PSM (SQL Persistent Stored Modules) от MySQL — это два мощных языка, предоставляющие возможности для создания сложных процедурных программ.

Несмотря на схожесть их целей, эти языки имеют ключевые различия.

В этой статье мы проведем глубокий анализ различий между PL/SQL и SQL/PSM, предоставим примеры кода и обсудим лучшие практики миграции между ними.

 

Введение в PL/SQL и SQL/PSM

Что такое PL/SQL?

PL/SQL — это расширение SQL, разработанное для работы с базами данных Oracle. Он позволяет создавать комплексные вычисления и автоматизировать операции через использование блоков кода, которые могут включать объявления переменных, управление курсорами, обработку исключений и выполнение SQL-запросов. PL/SQL поддерживает мощные структуры данных и механизмы для обработки ошибок, что делает его особенно подходящим для сложных корпоративных приложений.

Что такое SQL/PSM?

SQL/PSM (SQL Persistent Stored Modules) — это стандарт для создания хранимых процедур и функций в реляционных базах данных. В MySQL SQL/PSM позволяет разработчикам создавать программы, которые могут взаимодействовать с базой данных, управлять транзакциями и выполнять сложные операции. Хотя SQL/PSM и PL/SQL служат одной и той же цели, их синтаксис и возможности имеют различия, которые важно учитывать при миграции между платформами.

Основные различия в синтаксисе

Объявление процедур

Объявление процедур в PL/SQL и SQL/PSM различается по синтаксису. В PL/SQL используется ключевое слово CREATE OR REPLACE PROCEDURE, тогда как в SQL/PSM для этого используется CREATE PROCEDURE.

Пример объявления процедуры в PL/SQL

sql
CREATE OR REPLACE PROCEDURE increase_salary(p_emp_id IN NUMBER, p_increment IN NUMBER) IS BEGIN UPDATE employees SET salary = salary + p_increment WHERE employee_id = p_emp_id; END;
  • Описание: Процедура increase_salary принимает идентификатор сотрудника и сумму увеличения зарплаты, затем выполняет обновление зарплаты сотрудника.

Пример объявления процедуры в SQL/PSM (MySQL)

sql
CREATE PROCEDURE increase_salary(IN p_emp_id INT, IN p_increment DECIMAL(10,2)) BEGIN UPDATE employees SET salary = salary + p_increment WHERE employee_id = p_emp_id; END;
  • Описание: В MySQL аналогичная процедура также обновляет зарплату сотрудника, но использует тип данных DECIMAL для параметра p_increment.

Объявление переменных

Переменные в PL/SQL объявляются внутри блока DECLARE, в то время как в SQL/PSM переменные объявляются в теле процедуры с использованием ключевого слова DECLARE.

Пример объявления переменных в PL/SQL

sql
DECLARE v_total_salary NUMBER; BEGIN SELECT SUM(salary) INTO v_total_salary FROM employees; DBMS_OUTPUT.PUT_LINE('Total Salary: ' || v_total_salary); END;
  • Описание: Переменная v_total_salary используется для хранения суммы всех зарплат сотрудников, которая затем выводится на экран.

Пример объявления переменных в SQL/PSM (MySQL)

sql
CREATE PROCEDURE calculate_total_salary() BEGIN DECLARE v_total_salary DECIMAL(10,2); SELECT SUM(salary) INTO v_total_salary FROM employees; SELECT v_total_salary AS 'Total Salary'; END;
  • Описание: В MySQL переменная v_total_salary используется для хранения суммы зарплат и затем выводится в результате выполнения процедуры.

Управление курсорами

Курсоры позволяют обрабатывать строки, возвращаемые запросами. В PL/SQL и SQL/PSM синтаксис работы с курсорами различен.

Пример работы с курсорами в PL/SQL

sql
DECLARE CURSOR emp_cursor IS SELECT employee_id, first_name, last_name FROM employees; v_emp_id employees.employee_id%TYPE; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_emp_id, v_first_name, v_last_name; EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE emp_cursor; END;
  • Описание: Код открывает курсор emp_cursor, обрабатывает каждую строку и выводит информацию о сотрудниках.

Пример работы с курсорами в SQL/PSM (MySQL)

sql
CREATE PROCEDURE process_employees() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_emp_id INT; DECLARE v_first_name VARCHAR(50); DECLARE v_last_name VARCHAR(50); DECLARE emp_cursor CURSOR FOR SELECT employee_id, first_name, last_name FROM employees; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN emp_cursor; read_loop: LOOP FETCH emp_cursor INTO v_emp_id, v_first_name, v_last_name; IF done THEN LEAVE read_loop; END IF; SELECT CONCAT('ID: ', v_emp_id, ', Name: ', v_first_name, ' ', v_last_name); END LOOP; CLOSE emp_cursor; END;
  • Описание: В MySQL код выполняет ту же функцию, обрабатывая строки из курсора и выводя информацию о сотрудниках.

Обработка исключений

Обработка исключений в PL/SQL и SQL/PSM имеет разные подходы. В PL/SQL используется блок EXCEPTION, а в SQL/PSM используются обработчики DECLARE HANDLER.

Пример обработки исключений в PL/SQL

sql
BEGIN -- Код, который может вызвать ошибку INSERT INTO employees (employee_id, employee_name) VALUES (9999, 'John Doe'); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('Duplicate value error.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM); END;
  • Описание: Код обрабатывает исключения, такие как дублирование значений, и выводит соответствующие сообщения об ошибках.

Пример обработки исключений в SQL/PSM (MySQL)

sql
CREATE PROCEDURE insert_employee(p_emp_id INT, p_emp_name VARCHAR(100)) BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @error_message = 'Duplicate value error.'; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @error_message = 'An unexpected error occurred.'; INSERT INTO employees (employee_id, employee_name) VALUES (p_emp_id, p_emp_name); SELECT @error_message; END;
  • Описание: В MySQL обработчики управляют исключениями и устанавливают сообщения об ошибках.

Пакеты в PL/SQL и их отсутствие в SQL/PSM

PL/SQL поддерживает пакеты, которые группируют связанные процедуры, функции и переменные. SQL/PSM в MySQL не поддерживает пакеты, что может потребовать изменения подхода к организации кода.

Пример пакета в PL/SQL

sql
CREATE OR REPLACE PACKAGE employee_pkg AS PROCEDURE increase_salary(p_emp_id IN NUMBER, p_increment IN NUMBER); FUNCTION get_total_salary RETURN NUMBER; END employee_pkg; CREATE OR REPLACE PACKAGE BODY employee_pkg AS PROCEDURE increase_salary(p_emp_id IN NUMBER, p_increment IN NUMBER) IS BEGIN UPDATE employees SET salary = salary + p_increment WHERE employee_id = p_emp_id; END increase_salary; FUNCTION get_total_salary RETURN NUMBER IS v_total_salary NUMBER; BEGIN SELECT SUM(salary) INTO v_total_salary FROM employees; RETURN v_total_salary; END get_total_salary; END employee_pkg;
  • Описание: Пакет employee_pkg группирует связанные процедуры и функции для удобства использования и управления.

Лучшие практики при миграции

Миграция между различными СУБД и языками программирования требует тщательной подготовки и внимания к деталям. Вот несколько лучших практик для успешной миграции с PL/SQL на SQL/PSM:

1. Анализ и планирование

Проведите полный анализ текущих хранимых процедур, функций и триггеров. Определите, какие из них можно перенести без изменений, а какие потребуют переписывания. Составьте детальный план миграции, включающий все этапы и потенциальные проблемы.

2. Использование инструментов

Используйте автоматизированные инструменты для преобразования кода, такие как Oracle SQL Developer и MySQL Workbench. Эти инструменты помогут в конвертации кода и выявлении потенциальных проблем. Например, Oracle SQL Developer может помочь с анализом и экспортом кода в формат, подходящий для MySQL.

3. Тестирование

После миграции тщательно тестируйте все перенесенные объекты. Убедитесь, что они работают корректно и производительность не ухудшилась. Проведите как функциональное, так и нагрузочное тестирование. Создайте тестовые сценарии, которые проверят все ключевые функции и сценарии использования.

4. Документирование

Документируйте все изменения и особенности переноса. Это поможет в поддержке и развитии системы в будущем. Создайте документацию, описывающую преобразования, проблемы, с которыми вы столкнулись, и их решения.

5. Обучение

Обучите разработчиков и администраторов работе с новым языком и платформой. Это поможет обеспечить плавный переход и поддержку системы. Проведите тренинги и семинары по SQL/PSM для команды.

6. Мониторинг

После завершения миграции продолжайте мониторинг работы базы данных. Используйте инструменты мониторинга для отслеживания производительности и выявления возможных проблем. Настройте оповещения для критических ошибок и производственных проблем.

Заключение

Миграция с Oracle PL/SQL на MySQL SQL/PSM представляет собой сложный процесс, который требует внимания к деталям и тщательной подготовки.

Понимание различий между этими языками и следование лучшим практикам поможет вам успешно провести миграцию, минимизировав риски и оптимизировав производительность вашей базы данных.

Учитывайте уникальные особенности каждой системы и используйте доступные инструменты для упрощения процесса и обеспечения успешного перехода.

 

Получить консультацию о системах резервного копирования
Внимание! Данная статья не является официальной документацией.
Использование информации необходимо выполнять с осторожностью, используя для этого тестовую среду.
Закажите бесплатную пробную версию программного обеспечения для резервного копирования и кибербезопасности от ведущих мировых производителей: Воспользуйтесь бесплатным сервисом расчета спецификации программного обеспечения для резервного копирования и кибербезопасности:

 

Если у вас есть вопросы о построении современных систем резервного копирования, репликации, синхронизации данных и защиты от программ вымогателей обратитесь в нашу компанию для получения консультации о современных технологиях резервного копирования и восстановления данных.

Наша компания имеет более чем 25-летний опыт в этой области.

 

Современные системы виртуализации Современные технологии виртуальных контейнеров Защита виртуализации и контейнеров Программное обеспечение

Переход на OpenStack

Переход на oVirt

Переход на Proxmox

Переход на XCP-ng

Переход на zStack

Переход на контейнеры CRI-O

Переход на контейнеры Docker

Переход на контейнеры LXC

Переход на контейнеры Podman

Переход на контейнеры rkt

План аварийного восстановления (Disaster recovery plan)

Эффективная защита  виртуальных серверов

Эффективная защита виртуальных контейнеров

Программное обеспечение для виртуальных серверов и виртуальных контейнеров

Бесплатный расчет спецификации программного обеспечения

Получение пробной версии программного обеспечения

 

Управление и оркестрация виртуальными контейнерами

 Лучшие практики защиты виртуальных систем

Лучшие разные практики
 

Оркестратор Kubernetes

Оркестратор Docker Swarm

Оркестратор LXD

Лучшие практики защиты OpenStack

Лучшие практики защиты oVirt

Лучшие практики защиты Proxmox

Лучшие практики защиты XCP-ng

Лучшие практики защиты zStack

Разные лучшие практики
Moderne IT Technologies
  • Пользователи 1
  • Материалы 162
  • Кол-во просмотров материалов 16961

Если вас интересует всё, что связано с построением систем резервного копирования и защиты данных, приобретением необходимого программного обеспечения или получением консультаций - свяжитесь с нами.

Возможно это важно для вас. Все кто покупает у нас программное обеспечение получают бесплатную техническую поддержку экспертного уровня.