Создать вложенную хранимую процедуру - PullRequest
1 голос
/ 24 апреля 2019

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

Но я получаю эту ошибку

Код ошибки: 1357. Невозможно удалить или изменить ПРОЦЕДУРУ из другой хранимой процедуры

1 Ответ

1 голос
/ 24 апреля 2019

Как говорится в сообщении об ошибке, вы не можете удалить или изменить процедуру. Вы также не можете создать процедуру. Это не поддерживается MySQL.

https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html говорит:

Как правило, операторы, не разрешенные в операторах, подготовленных SQL, также не разрешены в хранимых программах. Список операторов, поддерживаемых как подготовленные операторы, см. В Раздел 13.5, «Синтаксис подготовленного оператора SQL» .

Вы можете перейти по этой ссылке на документацию по операторам SQL, которые поддерживаются как подготовленные операторы. Но список не включает CREATE PROCEDURE.

Таким образом, вам придется создать свою процедуру, запустив оператор SQL из приложения или скрипта.

Честно говоря, я вообще не использую хранимые процедуры в MySQL, потому что они очень неэффективны. Я понимаю, что люди, происходящие из культуры Microsoft SQL Server или Oracle, привыкли использовать хранимые процедуры для большей части своей работы, но при использовании MySQL чаще пишут код в скриптах на Python, Ruby, PHP или Perl. Для этих языков есть лучшие инструменты для редактирования и отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...