[英]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.