2010-12-13 53 views
1

我有一个存储过程来填充临时表。临时表使用多个动态SQL(“在”子句之间“有”&“)填充。我使用这个执行我的SQL存储过程中:Mysql(5.1.41)存储过程中的动态SQL问题

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 */ 

的问题是我的司机投诉,一旦它遇到的第一个EXECUTE语句,显然它认为MySQL是试图从一个存储过程返回一个结果。在存储过程中,mysql是如何运行的?

我得到这个错误的Ruby/Rails/mysql2驱动器 -

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

基本上驱动程序不支持从存储过程,这是很好的返回结果集。这不是问题,对我来说这个问题是为什么我的司机认为EXECUTE stmt1意味着结果集被返回?

有没有办法在Mysql来解决这个问题?

回答

0

看一看:http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

特别:“存储子程序不能包含任意SQL语句不允许下列语句:”

他们不允许在存储过程中“执行”。但是,如果您使用的是MySQL 5.x,则可以使用预准备语句。这可能是一个可行的选择,取决于你想要完成什么

+0

我在5.1.x上,所以我很好。我认为这个问题不是限制,但不知怎么的,在sp里面使用动态准备语句会让我的驱动程序认为它返回一个结果集,当它显然不是。 – kapso 2010-12-13 18:44:46

+0

对不起。我对Ruby驱动程序了解不多。快速谷歌发现其他问题与红宝石驱动程序mysql2,但他们都处理返回的结果集。 http://stackoverflow.com/questions/3902775/error-while-invoking-mysql-stored-procedurethat-returns-resultset-from-rails-3提到不使用mysql2驱动程序,和http://nasir.wordpress.com/ 2007/12/03/stored-procedures-and-rails /也让你使用ActiveRecord。也许ruby的mysql2驱动程序假设所有SP返回结果。一个简单的SP调用是否与驱动程序一起工作(没有SP)? – DTest 2010-12-14 01:59:05