2011-07-20 7 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枚のインサートがすべて動作することもありますが、そうでない場合もあります。ストアドプロシージャの最後の呼び出しで

、(TABLE1とTABLE2に)第2のインサートと最後の4つのインサート(表13〜16)動作ではなく、表3にインサート12に

なぜ説明できますか?私は同じ変数/ハンドルcommand1とstmt1を使用しているためにすることはできません? 、PrepareExecuteコマンドの組み合わせがプレースホルダして使用する必要がありますMySQLで

+0

を(http://tinyurl.com/so-hints)。生成されたステートメント(別のテーブルに挿入することによってステートメントを記録できます)をポストし、ストアドプロシージャが呼び出されたときに警告またはエラーが発生したかどうかを確認します。また、なぜパラメータではなく 'CONCAT'を使用していますか(' EXECUTE ... USING ... ')? – outis

+0

ストアドプロシージャ内では、 'SELECT @ Command1'のようにSELECTを使用してステートメントを単に印刷できます。他のテーブルをINSERT INTOする必要はありません。 Btwはなぜテーブルに挿入するのがうまくいかないのかをデバッグするために別のテーブルに挿入することは難しいかもしれません;) – wonk0

+1

実際に文字列を連結し、それをプリペアドステートメントに変換することはできませんか?それはパラメータの束縛を回避し、あなたはそれを複数回使用していません... – Naltharial

答えて

0

- 連結文字列であなたの時間を節約する(多分あなたのconcatsの一つは、単にうまくいかない)、そしてもちろん - (YEY!)SQLインジェクションを防ぐ

そう...この1つだけのようなあなたの文を作成:十分な[情報]ではありません

-- 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 
関連する問題