创建嵌套存储过程

时间:2019-04-23 22:09:46

标签: mysql stored-procedures

我正在使用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。无法从另一个存储的例程中删除或更改PROCEDURE

1 个答案:

答案 0 :(得分:1)

错误消息指出,您不能删除或更改过程。您也无法创建过程。 MySQL不支持。

https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html说:

  

通常,在SQL预准备语句中不允许的语句在存储程序中也不允许。有关作为预备语句支持的语句列表,请参见Section 13.5, “Prepared SQL Statement Syntax”

您可以单击该链接链接到作为准备好的语句支持的SQL语句的文档。但是该列表中包括CREATE PROCEDURE。

因此,您将必须通过从应用程序或脚本运行SQL语句来创建过程。

坦率地说,我根本不使用MySQL中的存储过程,因为它们效率很低。我了解来自Microsoft SQL Server或Oracle文化的人们习惯于在很多工作中使用存储过程,但是使用MySQL时,用Python,Ruby,PHP或Perl的脚本编写代码更为常见。有针对这些语言的更好的编辑和调试工具。