我正在尝试在 MySQL 中执行 CREATE PROCEDURE IF NOT EXISTS
。然而,看起来 MySQL 本身并不支持这一点,这对我来说似乎是一个重大疏忽。
我创建了一个包含业务模式定义的 Spring Batch Java 应用程序,其中包括表定义和存储过程定义。表定义很好,因为它们说 CREATE TABLE IF NOT EXISTS
。我希望存储过程定义相同,因为此业务架构脚本将在应用程序启动时随时运行。
MySQL 确实有 DROP PROCEDURE IF EXISTS
,但我担心在创建之前运行它会遇到可能的竞争条件。如果我运行了该应用程序的多个实例,并且在我执行 DROP 和随后的 CREATE 操作时,其他实例之一正在运行其中一个存储过程怎么办?这似乎是一个全面的坏主意。我不希望它中断任何已经在运行的东西。
现在肯定还有其他人遇到过同样的问题。解决方案是什么?
最佳答案
只需查询information_schema 中的routines 表即可。 示例:
select ROUTINE_BODY from routines where ROUTINE_NAME like '%BLA BLA%';
或者创建一个函数来查看 proc 是否存在:
use db_where_you_wanna_see_if_proc_exists;
delimiter $$
CREATE FUNCTION PROC_EXISTS(_proc_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
DECLARE _exists TINYINT(1) DEFAULT 0;
SELECT COUNT(*) INTO _exists
FROM information_schema.routines
WHERE ROUTINE_SCHEMA = DATABASE()
AND ROUTINE_NAME = _proc_name;
RETURN _exists;
END$$
delimiter ;
SELECT PROC_EXISTS('proc_name') as _exists;
关于mysql - 在尝试在 MySQL 中创建存储过程之前如何检查它是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511531/