2015-12-30 30 views
0

我的代碼是:遊標無法通過mysql存儲過程中的準備語句執行?

CREATE DEFINER=`root`@`windows7test-pc` PROCEDURE `new_procedure`() 
BEGIN 
declare str varchar(4000); 
set str='declare cur cursor for select *from student'; 
set @st=str; 
prepare stmt from @st; 
execute stmt; 
DEALLOCATE PREPARE stmt; 
open cur;//error 1324:undefined cursor...... why? 
END 

爲什麼cursur未申報這裏請及時通知我,我的問題

+0

可能因爲動態SQL在另一個上下文中,並且在它結束後,所有對象都不在範圍內。 – lad2025

+0

這個問題是一個** XY問題**的例子。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378 OP已經提出了幾個類似的問題,關於在MySQL存儲過程中有條件地/動態地聲明遊標。 OP沒有透露的是*爲什麼他需要這樣做。 OP尚未確定他正試圖解決的*實際問題*。 (問題OP詢問「爲什麼不能在準備好的語句中聲明遊標」在MySQL參考手冊中得到了回答。) – spencer7593

+0

OP說「通知我我的問題」。這個問題中代碼的問題(以及OP提出的類似問題中的代碼)是,它不可能*動態聲明遊標。 MySQL參考手冊記錄了用於聲明遊標的語法,以及對語法出現位置的限制。 – spencer7593

回答

1

摘錄:

...光標不能用於動態聲明準備和執行PREPARE和EXECUTE。遊標創建時檢查遊標的語句,因此語句不能是動態的。

參考:http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

注意,文件包括部分SQL語法準備語句中允許的,既不「DECLARE」也不是「CURSOR」出現在允許的語法的列表。

+0

:-sir是否有任何其他方法來執行此代碼?我想在IF .. ELSE塊中聲明遊標並在另一個IF..ELSE塊中打開該遊標block.please ..... –

+2

遊標聲明不能是動態的(在MySQL存儲過程中)。我不明白OP試圖解決什麼問題。我不明白爲什麼需要光標。如果程序需要一個遊標是有原因的,那麼只需要聲明&@%#CURSOR。遊標的OPEN可以是一個有條件的IF ,, THEN塊。 – spencer7593

+2

@Arunnagar在一個「IF」塊中聲明一個遊標並將其打開爲一個不同的「IF」塊**沒有意義**。如果你不打開它,不要聲明它。將這兩個語句放在一個內部(嵌套的)'BEGIN' /'END'塊中將解決你似乎試圖用這個明顯的[XY問題](http://xyproblem.info)來解決的問題。 –

相關問題