2011-07-20 56 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