2013-05-10 3 views
0

Я пытаюсь получить условное изменение параметра для оператора update. Я получаю следующее сообщение об ошибке при попытке следующей функцииОшибка Mysql: не разрешено возвращать результирующий набор из функции

/home/y/bin/mysql -u root <testpri.sql> out 
ERROR 1415 (0A000) at line 4: Not allowed to return a result set from a function 

Содержания testpri.sql следующим образом:

use `zestdb`; 
DROP FUNCTION IF EXISTS UPDATEPASSWD; 
DELIMITER // 
CREATE FUNCTION UPDATEPASSWD(n INT) RETURNS varchar(255) DETERMINISTIC 
BEGIN 
    DECLARE mypasswd varchar(255); 
    IF (n = 1) THEN 
     SET mypasswd = '12ccc1e5c3c9203af7752f937fca4ea6263f07a5'; 
     SELECT 'n is 1' AS ' '; 
    ELSE 
     SET mypasswd = '1a7bc371cc108075cf8115918547c3019bf97e5d'; 
     SELECT 'n is 0' AS ' '; 
    END IF;> 
    SELECT CONCAT('mypasswd is ', mypasswd) AS ' '; 
    RETURN mypasswd; 
END // 
DELIMITER ; 
CALL UPDATEPASSWD(0); 

Что мне не хватает?

ответ

2

Я думаю, что это на самом деле ваша отладка SELECT звонков.

От docs:

Statements that return a result set can be used within a stored procedure but not within a stored function. This prohibition includes SELECT statements that do not have an INTO var_list clause...

0

Я прибыл в поисках ответов на тот же вопрос, и нашел еще один способ обойти эту проблему, так что я могу использовать SELECT, заявление, что это сердце и душа функции MySQL, вызвавшей предупреждение.

Рассмотрите следующий фрагмент.

SET intNMatches = (SELECT COUNT (*) ...

SET принуждают в ЗЕЬЕСТ вернуть его один и только столбец, а количество строк, в intNMatches, локальную переменную оттенок BIGINT. Так как она содержит коммерческие секреты, я не могу показать остальную часть запроса. Достаточно сказать, что запрос устанавливается, не заставляя двигатель MySQL выдавать предупреждение.