2016-12-08 12 views
1

Ich habe eine gespeicherte Prozedur, die für eine Funktion namens brauchen werden, aber immer, dass ich versuche, ich habe folgende Fehlermeldung:Mysql Stored Function Call Stored Procedure

Dynamic SQL is not allowed in stored function or trigger

Meine Funktion:

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; 

Mein Stored Procedure:

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; 

Eine Vorstellung von der es wie lösen?

Antwort

1

Wie der Fehler sagte, Sie können nicht dynamische SQL in gespeicherten Funktion seit Ihrer Funktion Aufruf der SP und SP die dynamische SQL ausführen. Was Sie ass Alternative besteht darin, das dynamische SQL-Ergebnis in einer temporären Tabelle zu speichern und diese temporäre Tabelle in Ihrer Funktion wie

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); 

In Ihrer Funktion holt aus temporärer Tabelle statt dem Aufruf die Prozedur

IF (latitude <> '') THEN 
     set retorno = latitude; 
    ELSE 
     SELECT * FROM table2; 
    END IF;