mysql - 在尝试在 MySQL 中创建存储过程之前如何检查它是否存在?

标签 mysql stored-procedures

我正在尝试在 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/

相关文章:

MySQL 左连接第一个和第二个结果并作为一行返回

mysql - 停止 MySQL 中的存储过程?

sql - 优化查询以获取最小值/最大值

sql-server - 加载 SSIS 包时出错

php - 在 PHP 中使用 BLOB 的 getimagesize() 获取图像尺寸

javascript - Electronjs Mysql数据库提交查询随机访问

mysql - 使用 ODBC sql 查询的结果填充 VBA 数组

mysql - 不从 MySql 存储过程中检索正确的十六进制值

java - 在 HIbernate 中调用存储过程时找不到列 'id'

mysql - 一个 MySQL 查询中的两个独立请求