2016-12-08 2 views
1

Я хранимую процедуру, которая будет обязательно названием для функции, но когда-нибудь, что я пытаюсь Я следующее сообщение об ошибке:Mysql Хранится Вызов функции хранимых процедур

Dynamic SQL is not allowed in stored function or trigger

Моя функция:

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

Поскольку ошибка говорит, что вы не можете иметь динамический SQL в хранимой функции, поскольку ваша функция вызывает SP и SP, выполняющие динамический 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;