在MySQL中,有没有办法从另一个存储过程中创建一个存储过程?
我们通过使用临时存储过程来处理数据库更新,该过程检查表中的数据库版本:
DELIMITER #
DROP PROCEDURE IF EXISTS sp_temp_update_table#
CREATE PROCEDURE sp_temp_update_table()
BEGIN
DECLARE v_db_version DECIMAL(10,6);
SELECT CAST(`value` AS DECIMAL(10,6)) INTO v_db_version
FROM `db_metadata` meta
WHERE meta.`key` = 'db_version';
IF(v_db_version < CAST('13.30' AS DECIMAL(10,6))) THEN
-- UPDATE STATEMENTS HERE
ALTER TABLE `foo` ADD COLUMN `bar` INT(10);
UPDATE `etl_metadata` SET `value` = '13.30' WHERE `key` = 'db_version';
SELECT CONCAT('13.30 Update Applied - Original db_version=', v_db_version);
ELSE
SELECT '13.30 Update Not Needed';
END IF;
END#
CALL sp_temp_update_table()#
DROP PROCEDURE IF EXISTS sp_temp_update_table#
DELIMITER ;现在我们需要从这个过程中更新一个存储过程。
在MySQL中有什么方法可以做到这一点吗?
发布于 2017-02-03 02:56:36
你不能在MySQL中使用create a stored procedure in a prepared statement,通常你可以使用can't do anything in a stored procedure that you can't do in a prepared statement。
例如,您可以将过程的create语句读取到一个字符串(select routine_definition into myVar from information_schema.routines where routine_name='myRoutine')中,该字符串可用于让存储过程创建包含更新存储过程的命令的单个sql脚本。在运行上面的SP之后,您需要手动执行该sql (或从shell脚本、cron-job等执行),然后它将进行所需的更改。
编辑:这一切都假设动态更新SP确实是您想要做的事情。可能有更干净的解决方案,比如让你想要修改的硬编码部分取而代之的是输入参数,或者从表中读取...
https://stackoverflow.com/questions/42009327
复制相似问题