2010-12-13 16 views
1

J'ai une procédure stockée qui remplit une table temporaire. La table temporaire est remplie en utilisant plusieurs SQL dynamique (elle a "ayant" & "entre" clause). J'exécute ce SQL dans ma procédure stockée à l'aide:Mysql (5.1.41) SQL dynamique dans une procédure stockée issue

set @sql = concat("insert into my_temp select * from my_table where my_date between ", date1, " and ", date2) 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

/* more prepared dynamic statements */ 

Le problème est mes plaintes du pilote dès qu'il rencontre la première instruction EXECUTE, semble-t-il pense que MySQL tente de retourner un jeu de résultats à partir d'une procédure stockée. Est-ce ainsi que se comporte mysql quand il s'agit de sqls dynamiques dans les procédures stockées?

Je reçois cette erreur de pilote Ruby/Rails/de mysql2 -

Mysql2::Error: PROCEDURE my_db.sp_special_customers can't return a result set in the given context: 

Fondamentalement, le conducteur ne prend pas en charge result-ensembles retour de procédure stockée, ce qui est bien. Et ce n'est pas le problème, le problème pour moi est pourquoi mon pilote pense que EXECUTE stmt1 signifie qu'un jeu de résultats est retourné?

Existe-t-il un moyen de résoudre ce problème avec Mysql?

Répondre

0

Jetez un oeil à: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

particulièrement: «Les procédures stockées ne peuvent pas contenir des instructions SQL arbitraires Les déclarations suivantes ne sont pas autorisés: »

Ils ne permettent pas « Execute » dans la procédure stockée. Vous pouvez cependant utiliser des instructions préparées si vous utilisez mysql 5.x. Cela peut être une alternative viable, en fonction de ce que vous essayez d'accomplir.

+0

je suis sur 5.1.x, donc je suis bon. Je pense que le problème n'est pas une restriction, mais d'une façon ou d'une autre, l'utilisation d'une instruction préparée dynamique à l'intérieur de sp fait penser à mon pilote qu'il renvoie un resultset, quand ce n'est clairement pas le cas. – kapso

+0

Je suis désolé. Je ne connais pas beaucoup les pilotes Ruby. Un google rapide a trouvé d'autres problèmes avec le pilote mysql2 de ruby ​​mais ils traitaient tous de renvoyer des ensembles de résultats. http://stackoverflow.com/questions/3902775/error-while-invoking-mysql-stored-procedurethat-returns-resultset-from-rails-3 mentionne ne pas utiliser le pilote mysql2, et http://nasir.wordpress.com/ 2007/12/03/stored-procedures-and-rails/utilise également ActiveRecord. Peut-être que le pilote mysql2 de ruby ​​suppose que tous les SP retournent le résultat. Est-ce qu'un simple appel SP fonctionne avec le pilote (sans SP)? – DTest