我需要一个需要函数的存储过程,但是我尝试了以下错误:
存储函数或触发器
中不允许使用动态SQL
我的功能:
DROP FUNCTION IF EXISTS `clusbe`.`getLongitude`;
CREATE DEFINER=`root`@`localhost` FUNCTION `getLongitude`(`id` INT, `latitude` DOUBLE) RETURNS double
BEGIN
DECLARE retorno DOUBLE;
IF (latitude <> '') THEN
set retorno = latitude;
ELSE
CALL proc_getLongitude(1, 0);
END IF;
RETURN retorno;
END;
我的存储过程:
DROP PROCEDURE IF EXISTS clusbe.proc_getLongitude;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_getLongitude`(`id` INT, `longitude` DOUBLE)
BEGIN
DECLARE retorno DOUBLE;
IF (longitude <> '' AND longitude <> null) THEN
set retorno = latitude;
ELSE
set @sql = CONCAT("SELECT longitude FROM endereco as e, usuario as u WHERE e.id = u.endereco AND u.id = ", id);
PREPARE stmt FROM @sql;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
END IF;
END;
有什么想法解决它?
答案 0 :(得分:1)
正如错误所说,由于您的函数调用SP和SP执行动态SQL,因此您无法在存储函数中使用动态SQL。您可以做的另一种方法是将动态SQL结果存储在临时表中,并在函数中使用该临时表,如
set @sql = CONCAT("CREATE TEMPORARY TABLE table2 AS SELECT longitude FROM endereco as e, usuario as u WHERE e.id = u.endereco AND u.id = ", id);
在你的函数中,从临时表中获取而不是调用过程
IF (latitude <> '') THEN
set retorno = latitude;
ELSE
SELECT * FROM table2;
END IF;