2009-07-23 3 views
1

Je ne peux pas obtenir ce travail avec MySQL 5.x. Cette fonction doit renvoyer toutes les lignes pertinentes de l'instruction select:La fonction de création de MySQL ne retournera pas les ensembles

CREATE FUNCTION getuids(root INT) 
RETURNS SET OF INT AS $$ 
BEGIN 
RETURN SELECT uid FROM pages WHERE deleted = 0 
END 
$$ LANGUAGE 'SQL'; 

Une idée de ce que j'ai fait de mal?

Répondre

4

Une fonction MySQL peut ne pas retourner une ligne ou un ensemble de lignes dans MySQL. Seule une procédure stockée peut renvoyer des lignes. C'est vrai jusqu'à et y compris MySQL 5.4. Voir la page Limitations. L'utilisation de procédures stockées en tant que tables ou de valeurs de clause where dans les requêtes est également indisponible.

A propos du mieux que vous pouvez faire si vous avez besoin d'utiliser une fonction est d'utiliser GROUP_CONCAT pour obtenir les valeurs dans une liste séparée par des virgules:

CREATE FUNCTION getuids() RETURNS VARCHAR(1024) 
BEGIN 
SELECT GROUP_CONCAT(uid SEPARATOR ',') INTO @uid_list FROM pages WHERE deleted = 0; 
RETURN @uid_list; 
END 

Ensuite, dans votre instruction select qui doit vérifier les uids , vous pouvez utiliser la fonction FIND_IN_SET comme ceci:

SELECT ... WHERE FIND_IN_SET(my_field, get_uids()); 

PS J'avais initialement posté des liens vers les fonctions GROUP_CONCAT et FIND_IN_SET sur le site web de MySQL, mais Stack Overflow me permettait seulement d'utiliser un lien. Yay pour être nouveau.

Questions connexes