Mysql存储函数调用存储过程

时间:2016-12-08 13:51:03

标签: mysql stored-procedures stored-functions

我需要一个需要函数的存储过程,但是我尝试了以下错误:

  

存储函数或触发器

中不允许使用动态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;

有什么想法解决它?

1 个答案:

答案 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;