簡體   English   中英

創建嵌套存儲過程

[英]Create nested stored procedure

我正在使用 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 不支持它。

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 的腳本中編寫代碼。 這些語言有更好的編輯和調試工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM