правильный способ записи хранимой процедуры в mysql

127
13

Я написал одну хранимую процедуру в базе данных mysql следующим образом:

CREATE PROCEDURE sp_Test(
IN Mode VARCHAR(50),
IN UserID INT,
....
....
)
BEGIN
SET @sqlQuery = "";
IF (Mode = 'Select') THEN
//Select query
ELSEIF (Mode = 'Update') THEN
//update query
ELSEIF (Mode = 'Delete') THEN
//Delete query
END
END

и по моей потребности я могу назвать это так

CALL sp_Test("Select", 1, ...)
OR
CALL sp_Test("Update", 1, ...)
OR
CALL sp_Test("Delete", 1, ...)

Это нормально для производительности? Или я должен написать отдельные хранимые процедуры для каждого режима, например

для SELECT

CREATE PROCEDURE sp_Test_Select(
IN UserID INT,
....
....
)
BEGIN
//Select query
END

для ОБНОВЛЕНИЯ

CREATE PROCEDURE sp_Test_Update(
IN UserID INT,
....
....
)
BEGIN
//Select query
END

спросил(а) 2021-01-19T18:57:03+03:00 6 месяцев, 2 недели назад
1
Решение
100

Помимо ограничения производительности (если таковые вообще имеются); Всегда рекомендуется иметь отдельную процедуру, определенную для отдельных операций (select/insert/update/delete), потому что

Это увеличивает повторяемость.

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


Рассмотрим, про передачу параметра для разных операций. Для select скорее всего, вам не нужно передавать какие-либо параметры в процедуру, но для insert, update и delete вам придется передать параметр. Не будет ли беспорядок для вас отличать их в едином учебном теле?

ответил(а) 2021-01-19T18:57:03+03:00 6 месяцев, 2 недели назад
45

На мой взгляд, нет существенной разницы в эффективности этих процедур (если вы не собираетесь использовать их сотни раз в секунду 24x7).

Но есть разница в читаемости. Это значительная разница. test_DELETE(item) легче понять, чем test("delete", item). Имейте в виду, что вы пишете код не только для машины, но и для следующего человека, который будет работать над вашим проектом. Используйте вторую альтернативу.

ответил(а) 2021-01-19T18:57:03+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема