Создать вложенную хранимую процедуру

Я использую 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

Сообщение об ошибке кажется довольно ясным. Какой у Вас вопрос?

Bill Karwin 24.04.2019 00:44

Как создать хранимую процедуру внутри другой хранимой процедуры.

Agustin Eloy Barrios 24.04.2019 01:07
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
469
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как говорится в сообщении об ошибке, вы не можете удалить или изменить процедуру. Вы также не можете создать процедуру. Он не поддерживается 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 года. Я последую вашему совету, спасибо.

Agustin Eloy Barrios 24.04.2019 14:47

Другие вопросы по теме