2010-11-17 15 views
0

Je souhaite utiliser une procédure stockée pour définir la clause IN d'une instruction select. Ceci est (une version simplifiée de) ce que je suis en train de faire:mySQL - Utilisation des résultats de procédure stockée pour définir une instruction IN

SELECT * FROM myTable WHERE columnName IN (CALL myStoredProc) 

myStoredProc effectue une logique complexe dans la base de données et retourne une liste de valeurs correspondantes possibles pour columnName. La déclaration ci-dessus ne fonctionne pas évidemment. L'instruction select peut être exécutée dans un autre prodecure stocké si cela fait une différence.

Est-ce possible dans mySQL?

Répondre

0

Quel type de retour votre procédure stockée actuelle a-t-elle? Vous parlez d'une "liste", donc TEXT?

Peut-être existe-t-il un moyen plus simple, mais une chose que vous pouvez faire (dans une autre procédure stockée) est de créer une autre requête. Pour ce faire, nous devons contourner deux limitations de MySQL: a) Pour exécuter du SQL dynamique dans une procédure stockée, il doit s'agir d'une instruction préparée. b) Les instructions préparées peuvent uniquement être créées à partir de variables utilisateur. Ainsi, le SQL complet est:

SET @the_list = myStoredProc(); 
SET @the_query = CONCAT('SELECT * FROM myTable WHERE columnName IN (' , @the_list , ')'); 
PREPARE the_statement FROM @the_query; 
EXECUTE the_statement; 

Si vous parlez de retourner un jeu de résultats à partir d'une routine stockée puis l'utiliser comme table, cela est impossible. Vous devez créer une table temporaire pour travailler autour de this limitation.

+0

La procédure stockée renvoie des résultats qui sont une colonne d'entiers. Ai-je besoin de convertir ceci en une chaîne délimitée par des virgules? Aussi, j'ai essayé d'implémenter votre code (et j'ai ajouté SET @the_query ...), mais il pense que myStoredProc() est une fonction et donne l'erreur FUNCTION database.myStoredProc n'existe pas. (Code d'erreur 1305) – Ryan

+0

Également ajouté "SET". :) Oui, votre procédure doit être une fonction pour retourner quoi que ce soit. Si vous utilisez une table temporaire de toute façon, cela peut rester une procédure, bien sûr. – AndreKR