2011-07-20 106 views
2

我有一系列16個PREPARE,EXECUTE和DEALLOCATE語句(在存儲過程中),每個語句都將行插入一個不同的表(表1至表16)。例如:mysql PREPARE語句

SET @Command1 = CONCAT("insert into TABLE1" , ...etc..); 
PREPARE stmt1 FROM @Command1 ; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

SET @Command1 = CONCAT("insert into TABLE2" , ...etc..); 
PREPARE stmt1 FROM @Command1 ; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

. 
. 
. 

SET @Command1 = CONCAT("insert into TABLE16" , ...etc..); 
PREPARE stmt1 FROM @Command1 ; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

當我執行存儲過程時,INSERT間歇性地工作。有時候所有16個插頁都可以使用,但有時他們不會。

在存儲過程中的最後一個呼叫時,第一插入件2(成TABLE1和TABLE2)和最後4個插入物(表13〜16)工作,而不是插入到表3至12

你能解釋爲什麼嗎?不能因爲我使用相同的變量/句柄command1和stmt1?

+0

這還不夠[信息](http://tinyurl.com/so-hints)。發佈生成的語句(可以通過將它們插入到另一個表中來記錄它們),並查看它們在調用存儲過程時是否生成任何警告或錯誤。另外,爲什麼你使用'CONCAT'而不是參數('EXECUTE ... USING ...')? – outis

+0

在存儲過程中,您可以簡單地使用SELECT打印語句,如「SELECT @ Command1」;無需'INSERT INTO'其他表格。順便說一句插入到另一個表調試爲什麼插入到表不起作用可能會很困難;) – wonk0

+1

實際上有任何收益CONCATing一個字符串,並將其轉換爲準備好的語句?它繞開了參數綁定,並且你不會多次使用它... – Naltharial

回答

0

在MySQL中,PrepareExecute命令組合應該佔位符使用 - 節省您的時間與CONCAT字符串(您concats的,也許一個簡單的出錯),當然 - 防止SQL注入

(yey!)

所以...只是建立你的報表像這樣的:

-- in MySQL ? is a placeholder 
set @sampleQuery = 'select name into @testValue from myTable where id = ?'; 
set @idParam = 'NT54X9'; 

prepare sampleStatement from @sampleQuery; 
execute sampleStatement using @idParam; -- `using` is the key point here 
deallocate prepare sampleStatement; 

select @testValue