【问题标题】:Create nested stored procedure创建嵌套存储过程
【发布时间】:2019-04-23 22:09:46
【问题描述】:

我正在使用 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

【问题讨论】:

  • 错误信息似乎很清楚。你有什么问题?
  • 如何在其他存储过程中创建存储过程。

标签: mysql stored-procedures


【解决方案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 的脚本中编写代码。这些语言有更好的编辑和调试工具。

【讨论】:

  • 谢谢。我的坏处是假设它们自 2008 年以来已经发展得足够好。我会听从您的建议,谢谢。
猜你喜欢
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多