2010-12-13 58 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