Я использую Entity Framework Core и хочу использовать хранимую процедуру. Я создаю собственный SQL, чтобы создать его при миграции.
Скрипт генерации выглядит следующим образом:
DROP PROCEDURE IF EXISTS MigrationsScript;
DELIMITER //
CREATE PROCEDURE MigrationsScript()
BEGIN
IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '20190411134055_AddGenerations_sp') THEN
DROP PROCEDURE IF EXISTS GetCurrentGeneration;
CREATE PROCEDURE GetCurrentGeneration(IN timeOut INT, IN createBy char(255))
BEGIN
-- Stored procedure body
END
END IF;
END //
DELIMITER ;
CALL MigrationsScript();
DROP PROCEDURE MigrationsScript;
DROP PROCEDURE IF EXISTS MigrationsScript;
DELIMITER //
CREATE PROCEDURE MigrationsScript()
BEGIN
IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '20190411134055_AddGenerations_sp') THEN
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
VALUES ('20190411134055_AddGenerations_sp', '2.2.4-servicing-10062');
END IF;
END //
DELIMITER ;
CALL MigrationsScript();
DROP PROCEDURE MigrationsScript;
Но я получаю эту ошибку
Error Code: 1357. Can't drop or alter a PROCEDURE from within another stored routine
Как создать хранимую процедуру внутри другой хранимой процедуры.






Как говорится в сообщении об ошибке, вы не можете удалить или изменить процедуру. Вы также не можете создать процедуру. Он не поддерживается MySQL.
https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html говорит:
Generally, statements not permitted in SQL prepared statements are also not permitted in stored programs. For a list of statements supported as prepared statements, see Section 13.5, “Prepared SQL Statement Syntax”.
Вы можете перейти по этой ссылке к документации по операторам SQL, которые поддерживаются как подготовленные операторы. Но список нет включает CREATE PROCEDURE.
Таким образом, вам придется создать свою процедуру, запустив оператор SQL из приложения или сценария.
Честно говоря, я вообще не использую хранимые процедуры в MySQL, потому что они очень неэффективны. Я понимаю, что люди, пришедшие из культуры Microsoft SQL Server или Oracle, привыкли использовать хранимые процедуры для большей части своей работы, но при использовании MySQL чаще пишут код в сценариях на Python, Ruby, PHP или Perl. Для этих языков есть лучшие инструменты редактирования и отладки.
Спасибо. Плохо было предположить, что они достаточно эволюционировали с 2008 года. Я последую вашему совету, спасибо.
Сообщение об ошибке кажется довольно ясным. Какой у Вас вопрос?